function insert( key : typekey; var t : tree ) : integer;
var incr : integer;
begin
insert := 0;
if t = nil then begin
t := NewNode( key, nil, nil );
t^.bal := 0;
insert := 1
end
else if t^.k = key then
Error {*** Key already in table ***}
else with t^ do begin
if k < key then incr := insert( key, right )
else incr := -insert( key, left );
bal := bal + incr;
if (incr <> 0) and (bal <> 0) then
if bal < -1 then
{*** left subtree too tall: right rotation needed ***}
if left^.bal < 0 then rrot( t )
else begin lrot( left ); rrot( t ) end
else if bal > 1 then
{*** right subtree too tall: left rotation needed ***}
if right^.bal > 0 then lrot( t )
else begin rrot( right ); lrot( t ) end
else insert := 1;
end
end;
|