{ Example program for the rbtree unit (see http://www.vanwal.nl/rbtree/ for more information) } program RBTreeExample; uses SysUtils, rbtree; type IntP = ^Integer; { Function used as comparison function for a TRBTree of integer pointers } function CompareInt(i1, i2: IntP): Integer; begin if (i1^ < i2^) then begin Result := -1; end else if (i1^ = i2^) then begin Result := 0; end else begin Result := 1; end end; var i: Integer; rnd: IntP; intTree: TRBTree; it: TRBNodeP; begin Randomize; writeln('Creating intTree using CompareInt function'); intTree := TRBTree.Create(@CompareInt); writeln('Adding 50 random numbers to intTree:'); for i := 1 to 50 do begin New(rnd); rnd^ := Random(50); writeln(' ', rnd^); intTree.Add(rnd); { NOTE: Add() returns the inserted TRBNodeP, but it was not necessary in this example. } end; writeln('Removing lowest 10 numbers'); { NOTE: This will go wrong if more than 40 "random" numbers are equal, because these will only be stored once and after some deletions the tree will be empty and the program crashes. } for i := 1 to 10 do begin Dispose(IntP(intTree.First^.k)); { NOTE: On deletion, the memory the pointer is pointing to is not deallocated. } intTree.Delete(intTree.First) end; writeln('Printing remaining numbers in order:'); it := intTree.First; while it <> intTree.Last do begin writeln(' ', Integer(it^.k^)); Dispose(IntP(it^.k)); RBInc(it); end; writeln(' ', Integer(it^.k^)); Dispose(IntP(it^.k)); writeln('Destroying tree'); intTree.Destroy; end.