Program Classificator; Type T = string; The_Data = record {Dannie v liste} s: t; end; PItem = ^TItem; {element dereva} TItem = record Data : The_data; {klu4 dlya pechati } Key : integer; Next : PItem; {ykazatel na brata} Children : PItem; {ykazatel na sinovei} end; function FindByKey (root: PItem; k:integer):PItem; {ykazatel na roditelya po ego indeksy} var p, found :PItem; begin found:= nil; p:=root; {esli koren nenylevoi} If p <> nil then begin while (found = nil) and (p <> nil) do begin {esli klu4 kornevogo elementa raven iskomumu, prekrawaem poisk} if p^.key = k then found:=p else found := FindByKey(p^.children,k); {recursivno ishem v detyah} p:= p^.next; end; end; {vozvrashaem resultat, nil = esli ne nashli} findBykey:= found; end; {Peredaem v proceduru koren dereva, ykazatel na roditelya i vnosimie dannie} procedure Add ( var root:PItem;parent:PItem; value:the_data); var new_item,p_child:PItem; begin {videlyem pamyt i obnulyaem spisok optomkov i bratev} new(new_item); new_item^.next:=nil; new_item^.children:=nil; new_item^.key:= 0; new_item^.data:= value; {kopiruem dannie v pamyt} If parent = nil then {derevo nulevoe} begin {ne kopiruutsya li dannie} if root <> nil then begin writeln ('ERROR - duplicate data!') ; dispose(new_item) ; end else root := new_Item; {vse ok} end else begin {i 2 slu4ai kogda roditel naiden, dobavlyem k potomkam} p_child:=parent^.children; if p_child = nil then parent^.children:=new_item else begin {a esli yge est bratya} while p_child^.next <> nil do p_child:=p_child^.next; p_child^.next:= new_item; end; end; end; var curr_index: integer; procedure Printing(level: integer; root: PItem; visual: boolean); var p: PItem; begin p := root; while p <> nil do begin inc(curr_index); p^.key := curr_index; if visual then writeln(p^.key:4, '':succ(2*level), p^.data.s); Printing(level+1, p^.children, visual); p := p^.next; end; end; procedure Print(root: PItem; visual: boolean); begin curr_index := 0; printing(0, root, visual); end; var i, p_ix: integer; r: the_data; tree_root, new_root: PItem; f: text; begin tree_root := nil; for i := 1 to 3 do begin write('parent index = '); readln(p_ix); write('data = '); readln(r.s); Add(tree_root, FindByKey(tree_root, p_ix), r); Print(tree_root, true); end; Writeln ('Konec') ; readln; end.