Теоретический материал
{$O-} {$MAXSTACKSIZE 30000000} program dec_tree; {$APPTYPE CONSOLE} uses SysUtils; type int=longint; real=extended; bool=boolean; TKey=int; PEl=^TEl; TEl=record key:TKey; y:int; L,R:PEl; end; TDecTree=object root:PEl; procedure Init; procedure Add(const a:TKey); function Search(const a:TKey):PEl; procedure Delete(const a:TKey); procedure Print; end; const maxRand=1000000000; mx=100000; var tr:TDecTree; a:array[0..mx] of Bool; i,t:int; procedure TDecTree.Init; begin root:=nil; end; procedure Split(pt: PEl; key: TKey; var pL,pR:PEl); begin if pt=nil then begin pL:=nil; pR:=nil; end else if pt^.keypR^.y then begin p:=pL; Merge(p^.R,p^.R,pR); end else begin p:=pR; Merge(p^.L,pL,p^.L); end end; procedure Delete1(var p:PEl; const A:TKey); begin if p=nil then Writeln('No such element') else if A=p^.key then Merge(p,p^.L,p^.R) else if A nil then begin Print1(P^.L); Write(p^.key,' '); Print1(P^.R); end; end; procedure TDecTree.Print; begin Print1(root); end; procedure TDecTree.Delete(const a:TKey); begin Delete1(root,a); end; begin Randomize; RandSeed:=Random(1000); // RandSeed:=722; Writeln(RandSeed); tr.Init; fillchar(a,sizeof(a),0); for i := 1 to 3*mx do begin t:=mx-i mod mx; // t:=random(mx); if a[t]<>(tr.Search(t)<>nil) then Writeln(IntToStr(i) + ' 1'+'BAD!!!'); if a[t] then tr.Delete(t) else tr.Add(t); a[t]:=not a[t]; if a[t]<>(tr.Search(t)<>nil) then Writeln(IntToStr(i) + ' 2'+'BAD!!!'); Writeln(i,' ok ', ord(a[t])); // Write ('Added ', t, ' Now: '); // tr.Print; // readln; // writeln; end; Readln; end.