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

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

type

TtdBinaryTree - class {класс бинарного дерева}

private

FCount : integer;

FDispose : TtdDisposeProc;

FHead : PtdBinTreeNode;

FName : TtdNameString;

protected

procedure btError(aErrorCode : integer;

const aMethodName : TtdNameString);

function btLevelOrder(aAction : TtdVisitProc;

aExtraData : pointer): PtdBinTreeNode;

function btNoRecInOrder(aAction : TtdVisitProc;

aExtraData : pointer): PtdBinTreeNode;

function btNoRecPostOrder(aAction : TtdVisitProc;

aExtraData : pointer): PtdBinTreeNode;

function btNoRecPreOrder(aAction : TtdVisitProc;

aExtraData : pointer): PtdBinTreeNode;

function btRecIn0rder(aNode : PtdBinTreeNode; aAction : TtdVisitProc;

aExtraData : pointer): PtdBinTreeNode;

function btRecPostOrder(aNode : PtdBinTreeNode; aAction : TtdVisitProc;

aExtraData : pointer): PtdBinTreeNode;

function btRecPreOrder(aNode : PtdBinTreeNode; aAction : TtdVisitProc;

aExtraData : pointer): PtdBinTreeNode;

public

constructor Create(aDisposeItem : TtdDisposeProc);

destructor Destroy; override;

procedure Clear;

procedure Delete(aNode : PtdBinTreeNode);

function InsertAt(aParentNode : PtdBinTreeNode;

aChildType : TtdChildType; aItem : pointer): PtdBinTreeNode;

function Root : PtdBinTreeNode;

function Traverse(aMode : TtdTraversalMode; aAction : TtdVisitProc;

aExtraData : pointer; aUseRecursion : boolean): PtdBinTreeNode;

property Count : integer read FCount;

property Name : TtdNameString read FName write FName;

end;

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

Листинг 8.10. Методы Create и Destroy класса бинарного дерева

constructor TtdBinaryTree.Create(aDisposeItem : TtdDisposeProc);

begin

inherited Create;

FDispose := aDisposeItem;

{проверить, доступен ли диспетчер узлов}

if (BTNodeManager = nil) then

BTNodeManager := TtdNodeManager.Create(sizeof(TtdBinTreeNode));

{выделить заглавный узел; со временем корневой узел дерева станет его левым дочерним узлом}

FHead := BTNodeManager.AllocNodeClear;

end;

destructor TtdBinaryTree.Destroy;