unit Treeunit; interface Procedure Init_Tree(Root:ttree); procedure Insert(var Root: TTree; X: T); procedure Delete(Root: TTree); procedure LeafsCount(Root: TTree; var k: Integer); procedure Printtree(T:TTree;h:integer); function Leaves(t: ttree): integer; implementation Procedure Init_Tree(Root:ttree); begin root:=nil 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) end; end; procedure Delete(Root: TTree); begin if Root = nil then exit; Delete(Root^.Right); Delete(Root^.Left); Dispose(Root) end; procedure Printtree(T:TTree;h:integer); var i:integer; begin if T<>nil then with T^ do begin Printtree(right,h+3); for i:=1 to h do write(' '); write(info); writeln; Printtree(left,h+3) end end; procedure LeafsCount(Root: TTree; var k: Integer); begin if Root <> nil then begin LeafsCount(Root^.Left, k); if (Root^.Left = nil) and (Root^.Right = nil) then Inc(k); LeafsCount(Root^.Right, k) end end; function Leaves(t: ttree): integer; const max_nodes = 100; var st: array[1 .. max_nodes] of ttree; sp, counter: integer; begin sp := 0; counter := 0; repeat while t <> nil do begin inc(sp); st[sp] := t; t := t^.left; end; if sp = 0 then begin Leaves := counter; exit; end; t := st[sp]; dec(sp); if (T^.right = nil) and (T^.left = nil) then inc(counter); t := t^.right; until false; end; end.