program tree; type TTree = ^TNode; t=record n:integer; c,d,fam:string[25]; end; TNode = record value: T; Left, Right: TTree; end; var i: Integer; first,myTree, wasfound: TTree; F:file of t; procedure PrintDown(Root: TTree); var p:TTree; begin if Root = nil then exit; with Root^ do begin Writeln(p^.value.fam); PrintDown(Left); PrintDown(Right) end end; procedure Insert(var Root: TTree; X: T); procedure CreateNode(var p: TTree; n: T); begin New(p); p^.value := n; p^.Left := nil; p^.Right := nil end; begin if Root = nil Then CreateNode(Root, X) else with Root^ do begin if value <= X then Insert(Right, X) else if value > X Then Insert(Left, X) else { Действия, производимые в случае повторного внесения зл-тов в дерево} end; end; procedure GetNode(Root: TTree); var GN:T; begin if Root = nil then WriteLn('Дерево пусто!') else GN:=Root^.value; end; function Find(Root: TTree; X: T): TTree; begin if Root = nil then Find := nil else if X = Root^.value then Find := Root else if X < Root^.value then Find := Find(Root^.Left, X) else Find := Find(Root^.Right, X); end;} function DeleteMin(var Root: TTree): T; begin if Root^.Left = nil then begin DeleteMin := Root^.value; Root := Root^.Right; end else {узел Root имеет левый подзл-т} DeleteMin := DeleteMin(Root^.Left); end; procedure Remove(var Root: TTree; X: T); begin if Root <> nil then if X < Root^.value then Remove(Root^.Left, X) else if X > Root^.value then Remove(Root^.Right, X) else if (Root^.Left = nil) and (Root^.Right = nil) then {Нет подэл-тов, удаляется узел, на который указывает Root} Root := nil else if Root^.Left = nil then Root := Root^.Right else if Root^.Right = nil then Root := Root^.Left else {у удаляемого эл-та есть оба подэл-та} Root^.value := DeleteMin(Root^.Right); end; Procedure Delete(T: TTree); begin If T = nil Then Exit; Delete(T^.Right); Delete(T^.Left); Dispose(T) end; Begin Assign(F,'data'); Reset(F); for i:=0 to FileSize(F)-1 do begin Read(F,tek1^.dat.fam); CreateNode(First); end; PrintDown; ReadLn; End.