program BinaryTrees; const Key = 0; Left = 1; Right = 2; procedure AddNode(const Root, X: Variant); begin if Root = nil then Root := [X, nil, nil] else if X < Root[Key] then AddNode(@Root[Left], X) else if X > Root[Key] then AddNode(@Root[Right], X); end; function Search(const Root, X: Variant); begin if Root = nil then result := nil else if X = Root[Key] then result := Root else if X < Root[Key] then result := Search(Root[Left], X) else result := Search(Root[Right], X); end; procedure DeleteNode(Root, X: Variant); var P, R: Variant; begin R := Search(Root, X); if R = nil then Exit; if (R[Left] = nil) and (R[Right] = nil) then reduced R := nil else if R[Left] = nil then reduced R := R[Right] else if R[Right] = nil then reduced R := R[Left] else begin P := @ R[Left]; while P[Right] <> nil do P := @ P[Right]; R[Key] := P[Key]; reduced P := P[Left]; end; end; procedure PreOrder(const Root: Variant); begin if Root = nil then Exit; writeln(Root[Key]); PreOrder(Root[Left]); PreOrder(Root[Right]); end; procedure InOrder(const Root: Variant); begin if Root = nil then Exit; InOrder(Root[Left]); writeln(Root[Key]); InOrder(Root[Right]); end; procedure PostOrder(const Root: Variant); begin if Root = nil then Exit; PostOrder(Root[Right]); PostOrder(Root[Left]); writeln(Root[Key]); end; var Tree, X: Variant; begin AddNode(@Tree, 10); AddNode(@Tree, 5); AddNode(@Tree, 15); AddNode(@Tree, 3); AddNode(@Tree, 8); AddNode(@Tree, 13); AddNode(@Tree, 18); writeln(Tree); InOrder(Tree); X := Search(Tree, 5); writeln(X); DeleteNode(@Tree, 10); writeln(Tree); end.