52704.fb2 Фундаментальные алгоритмы и структуры данных в Delphi - читать онлайн бесплатно полную версию книги . Страница 135

Фундаментальные алгоритмы и структуры данных в Delphi - читать онлайн бесплатно полную версию книги . Страница 135

function TtdBinaryTree.btRecPreOrder(aNode : PtdBinTreeNode;

aAction : TtdVisitProc; aExtraData : pointer): PtdBinTreeNode;

var

StopNow : boolean;

begin

Result := nil;

StopNow := false;

aAction(aNode^.btData, aExtraData, StopNow);

if StopNow then begin

Result :=aNode;

Exit;

end;

if (aNode^.btChild[ctLeft] <> nil) then begin

Result := btRecPreOrder(aNode^.btChild[ctLeft], aAction, aExtraData);

if (Result <> nil) then

Exit;

end;

if (aNode^.btChild[ctRight]<> nil) then begin

Result := btRecPreOrder(aNode^.btChild[ctRight], aAction, aExtraData);

end;

end;

function TtdBinaryTree.Traverse(aMode : TtdTraversalMode;

aAction : TtdVisitProc;

aExtraData : pointer;

aUseRecursion : boolean): PtdBinTreeNode;

var

RootNode : PtdBinTreeNode;

begin

Result := nil;

RootNode := FHead^.btChild[ctLeft];

if (RootNode <> nil) then begin

case aMode of

tmPreOrder :

if aUseRecursion then

Result := btRecPreOrder(RootNode, aAction, aExtraData) else

Result := btNoRecPreOrder(aAction, aExtraData);

tmlnOrder :

if aUseRecursion then

Result :=btRecInOrder(RootNode, aAction, aExtraData) else

Result := btNoRecInOrder(aAction, aExtraData);

tmPostOrder :

if aUseRecursion then

Result := btRecPostOrder(RootNode, aAction, aExtraData) else

Result := btNoRecPostOrder(aAction, aExtraData);

tmLevelOrder : Result :=btLevelOrder(aAction, aExtraData);

end;

end;

end;

Как видно из кода внутренних рекурсивных процедур, возможность прекращения обхода в любой момент времени делает код несколько менее читабельным и более сложным.

Исходный код класса TtdBinaryTree можно найти на Web-сайте издательства, в разделе материалов. После выгрузки материалов отыщите среди них файл TDBinTre.pas.

Деревья бинарного поиска