home *** CD-ROM | disk | FTP | other *** search
- procedure InOrder (Ptr : Rec_Ptr);
- begin
- if Ptr <> nil then
- begin
- InOrder (Ptr^.LPtr);
- PrintNode (Ptr);
- InOrder (Ptr^.RPtr);
- end;
- end; { procedure InOrder }
-
-
- procedure PreOrder (Ptr : Rec_Ptr);
- begin
- if Ptr <> nil then
- begin
- PrintNode (Ptr);
- PreOrder (Ptr^.LPtr);
- PreOrder (Ptr^.RPtr);
- end;
- end; { procedure PreOrder }
-
-
- procedure PostOrder (Ptr : Rec_Ptr);
- begin
- if Ptr <> nil then
- begin
- PostOrder (Ptr^.LPtr);
- PostOrder (Ptr^.RPtr);
- PrintNode (Ptr);
- end;
- end; { procedure PostOrder }
-
-
- procedure FindNode (Root : Rec_Ptr;
- var Ptr : Rec_Ptr;
- Comp_Ptr : Rec_Ptr;
- var Node_Found : boolean);
- var Relation : char;
- begin
- Node_Found := false;
- Ptr := nil;
- if Root <> nil then begin
- CompareNode (Comp_Ptr, Root, Relation);
- case Relation of
- 'L' : FindNode (Root^.LPtr, Ptr, Comp_Ptr, Node_Found);
- 'G' : FindNode (Root^.RPtr, Ptr, Comp_Ptr, Node_Found);
- 'E' : begin
- Node_Found := true;
- Ptr := Root;
- end;
- end; { case Relation }
- end;
- end; { procedure FindNode }
-
-
- procedure AddNode (var Root : Rec_Ptr;
- Ptr : Rec_Ptr;
- Cnt : integer;
- var Node_Added : boolean);
- var Relation : char;
- begin
- Node_Added := false;
- if Root = nil then begin
- Root := Ptr;
- Node_Added := true;
- end else begin
- CompareNode (Ptr, Root, Relation);
- case Relation of
- 'L' : begin
- AddNode (Root^.LPtr, Ptr, Cnt, Node_Added);
- if Node_Added then Root^.LCtr := Root^.LCtr + Cnt;
- end;
- 'G' : begin
- AddNode (Root^.RPtr, Ptr, Cnt, Node_Added);
- if Node_Added then Root^.RCtr := Root^.RCtr + Cnt;
- end;
- 'E' : writeln ('Node not added. Nodes equal.',
- ' Root = ', Root^.Data,
- ' New data = ', Ptr^.Data);
- else writeln ('Node not added. Root = ', Root^.Data,
- ' New data = ', Ptr^.Data);
- end; { case Relation }
- end;
- end; { procedure AddNode }
-
-
- procedure DeleteNode (var Root : Rec_Ptr;
- Del_Ptr : Rec_Ptr;
- var Node_Deleted : boolean);
- var Temp : Rec_Ptr;
- Flag : boolean;
- Relation : char;
- begin
- Node_Deleted := false;
- if Root <> nil then
- begin
- CompareNode (Root, Del_Ptr, Relation);
- case Relation of
- 'G' : begin
- DeleteNode (Root^.LPtr, Del_Ptr, Node_Deleted);
- if Node_Deleted then
- Root^.LCtr := Root^.LCtr - 1;
- end;
- 'L' : begin
- DeleteNode (Root^.RPtr, Del_Ptr, Node_Deleted);
- if Node_Deleted then
- Root^.RCtr := Root^.RCtr - 1;
- end;
- 'E' : begin
- Node_Deleted := true;
- if Root^.RPtr <> nil then
- AddNode (Root^.LPtr, Root^.RPtr,
- Root^.RCtr, Flag);
- Temp := Root;
- Root := Root^.LPtr;
- dispose (Temp);
- end;
- end; { case Relation }
- end;
- end; { procedure DeleteNode }
-
-
- procedure BalanceTree (var Root : Rec_Ptr);
-
- procedure MoveDown (var Root : Rec_Ptr);
- var Flag : boolean;
- Ptr : Rec_Ptr;
- begin
- Ptr := Root;
- if Root^.LCtr > Root^.RCtr then
- begin
- Root := Root^.LPtr;
- AddNode (Root, Ptr, Ptr^.RCtr + 1, Flag);
- Ptr^.LPtr := nil;
- Ptr^.LCtr := 0;
- end else
- begin
- Root := Root^.RPtr;
- AddNode (Root, Ptr, Ptr^.LCtr + 1, Flag);
- Ptr^.RPtr := nil;
- Ptr^.RCtr := 0;
- end;
- end; { procedure MoveDown }
-
-
- begin { procedure BalanceTree }
- if (Root^.LPtr <> nil) or (Root^.RPtr <> nil) then
- begin
- while abs (Root^.LCtr - Root^.RCtr) > 1 do
- MoveDown (Root);
- if Root^.LPtr <> nil then BalanceTree (Root^.LPtr);
- if Root^.RPtr <> nil then BalanceTree (Root^.RPtr);
- end;
- end; { procedure BalanceTree }
-
-
- procedure CountNodes (Root : Rec_Ptr);
- begin
- if Root <> nil then begin
- CountNodes (Root^.LPtr);
- CountNodes (Root^.RPtr);
- if Root^.LPtr = nil
- then Root^.LCtr := 0
- else Root^.LCtr := Root^.LPtr^.LCtr + Root^.LPtr^.RCtr + 1;
- if Root^.RPtr = nil
- then Root^.RCtr := 0
- else Root^.RCtr := Root^.RPtr^.LCtr + Root^.RPtr^.RCtr + 1;
- end;
- end; { procedure CountNodes }
-
-
- procedure RebuildTree (var Root : Rec_Ptr;
- var Tree_Rebuilt : boolean;
- Old_Key : byte);
- var New_Root : Rec_Ptr;
-
-
- procedure RestructureTree (Old_Root : Rec_Ptr;
- var New_Root : Rec_Ptr;
- var Tree_Rebuilt : boolean);
- var Node_Added : boolean;
- begin
- if Old_Root <> nil then begin
- RestructureTree (Old_Root^.LPtr, New_Root, Tree_Rebuilt);
- if Tree_Rebuilt then begin
- Old_Root^.LPtr := nil;
- Old_Root^.LCtr := 0;
- RestructureTree (Old_Root^.RPtr, New_Root, Tree_Rebuilt);
- if Tree_Rebuilt then begin
- Old_Root^.RPtr := nil;
- Old_Root^.RCtr := 0;
- AddNode (New_Root, Old_Root, 1, Node_Added);
- if not Node_Added then Tree_Rebuilt := false;
- end;
- end;
- end;
- end; { procedure RestructureTree }
-
-
- begin
- New_Root := nil;
- Tree_Rebuilt := true;
- RestructureTree (Root, New_Root, Tree_Rebuilt);
- if Tree_Rebuilt
- then Root := New_Root
- else begin
- Key_Field := Old_Key;
- Tree_Rebuilt := true;
- RestructureTree (New_Root, Root, Tree_Rebuilt);
- Tree_Rebuilt := false;
- CountNodes (Root);
- end;
- BalanceTree (Root);
- end; { procedure RebuildTree }