WhileRAux.mLink[0] > -1 do
Begin
// Движемся к самому правому потомку RAux.
lRightest := RAux.mLink[RAux.nData];
SeekAndRead(lRightest, RAux);
end;
// Напоминаем: надо удалить ключ R.mData[i],
// который находится на НЕтерминальной странице.
sAux := R.mData[i];
R.mData[i] := RAux.mData[RAux.nData];
RAux.mData[RAux.nData] := sAux;
SeekAndWrite(lStartPage, R);
SeekAndWrite(lRightest, RAux);
// А мы вот взяли и обменяли значениями
// ключи R.mData[i] и RAux.mData[RAux.nData].
// Чем это лучше?
// Тем, что теперь надо удалять ключ RAux.mData[RAux.nData]
// из ТЕРМИНАЛЬНОЙ страницы.
// А чем это хуже?
// Тем, что дерево испорчено. Оно теперь НЕ ЕСТЬ дерево поиска.
// Почему?
// Доступ к удаляемому ТЕРМИНАЛЬНОМУ ключу
// возможен только от ЛЕВОЙ ссылки под R.mData[i]
// (а не от правой, как должно быть у дерева поиска).
// Но возможен же! Так что получим этот доступ и удалим.
ExcludeKey(sFind, iLevel + 1, R.mLink[i - 1], bBecameTooFew);
// Всё! Дерево вновь стало нормальным деревом поиска.
IfbBecameTooFew then
MergeTwoPages(i - 1, R.mData[i]);
Exit;
end;
end;
fori := 1 toR.nData do
Begin
iR := StringCompare(sFind, R.mData[i]);
IfiR < 0 then
Begin
ExcludeKey(sFind, iLevel + 1, R.mLink[i - 1], bBecameTooFew);
// Это bBecameTooFew пришло СЮДА от дочернего экземпляра ExcludeKey
// и будет использовано ЗДЕСЬ.
Дата добавления: 2015-08-21; просмотров: 554;