home *** CD-ROM | disk | FTP | other *** search
- program TREE;
-
- type
- Rec_Ptr = ^Data_Record;
- Rec_Num = integer;
- Rec_Char = char;
- Data_Record = record
- Data : Rec_Num;
- Data2 : Rec_Char;
- LCtr, RCtr : integer;
- LPtr, RPtr : Rec_Ptr;
- end;
-
- var
- Root, Ptr : Rec_Ptr;
- Test_Ptr : Rec_Ptr;
- Node_Added,
- Node_Found,
- Node_Deleted,
- Tree_Rebuilt : boolean;
- Option : char;
- Key_Field : byte;
- Tab : array [0..15] of byte;
- I, Rand : integer;
- New_Char : Rec_Char;
- Count : integer;
-
- procedure CreateNode (New_Data : Rec_Num;
- New_Data2 : Rec_Char;
- var Ptr : Rec_Ptr);
- begin
- new (Ptr);
- Ptr^.Data := New_Data;
- Ptr^.Data2 := New_Data2;
- Ptr^.LCtr := 0;
- Ptr^.RCtr := 0;
- Ptr^.LPtr := nil;
- Ptr^.RPtr := nil;
- end; { procedure CreateNode }
-
- procedure CompareNode (Ptr1, Ptr2 : Rec_Ptr;
- var Relation : char);
- begin
- case Key_Field of
- 1 : begin
- if Ptr1^.Data < Ptr2^.Data then Relation := 'L';
- if Ptr1^.Data > Ptr2^.Data then Relation := 'G';
- if Ptr1^.Data = Ptr2^.Data then Relation := 'E';
- end;
- 2 : begin
- if Ptr1^.Data2 < Ptr2^.Data2 then Relation := 'L';
- if Ptr1^.Data2 > Ptr2^.Data2 then Relation := 'G';
- if Ptr1^.Data2 = Ptr2^.Data2 then Relation := 'E';
- end;
- else Relation := ' ';
- end; { case Key_Field }
- end; { procedure CompareNode }
-
- procedure PrintNode (Ptr : Rec_Ptr);
- begin
- writeln (Ptr^.Data:3, ' ',
- Ptr^.Data2, ' ',
- Ptr^.LCtr:3, ' ',
- Ptr^.RCtr:3);
- end; { procedure PrintNode }
-
- {$I tree.inc }
-
-
- procedure GetKeyData (Test_Ptr : Rec_Ptr);
- begin
- if Key_Field = 1
- then begin
- write ('enter an integer : ');
- readln (Rand);
- Test_Ptr^.Data := Rand;
- end
- else begin
- write ('enter a character : ');
- readln (New_Char);
- Test_Ptr^.Data2 := New_Char;
- end;
- end; { procedure GetKeyData }
-
-
- begin
- Root := nil;
- Key_Field := 1;
- New_Char := 'A';
- new (Test_Ptr);
- randomize;
- for I := 1 to 15 do Tab [I] := 0;
- Count := 0;
- repeat
- Rand := random (16);
- if Tab [Rand] = 0 then
- begin
- Count := Count + 1;
- Tab [Rand] := 1;
- CreateNode (Rand, New_Char, Ptr);
- AddNode (Root, Ptr, 1, Node_Added);
- New_Char := succ (New_Char);
- end;
- until Count = 15;
- repeat
- writeln ('A : Add node');
- writeln ('B : Find node');
- writeln ('C : Delete node');
- writeln ('D : Balance tree');
- writeln ('E : Rebuild tree');
- writeln ('F : Inorder search');
- writeln ('G : Preorder search');
- writeln ('H : Postorder search');
- writeln ('I : Change keys');
- writeln ('X : Exit program');
- writeln; write ('please choose one : '); readln (Option);
- Option := upcase (Option);
- case Option of
- 'A' : begin
- writeln ('adding a new node');
- write (' enter an integer : '); readln (Rand);
- write ('enter a character : '); readln (New_Char);
- CreateNode (Rand, New_Char, Ptr);
- AddNode (Root, Ptr, 1, Node_Added);
- if Node_Added
- then writeln ('Node added.')
- else writeln ('Node not added. Duplicate keys.');
- end;
- 'B' : begin
- writeln ('finding a node');
- GetKeyData (Test_Ptr);
- FindNode (Root, Ptr, Test_Ptr, Node_Found);
- if Node_Found
- then PrintNode (Ptr)
- else writeln ('node not found');
- end;
- 'C' : begin
- writeln ('deleting a node');
- GetKeyData (Test_Ptr);
- DeleteNode (Root, Test_Ptr, Node_Deleted);
- if Node_Deleted then writeln ('Node deleted.')
- else writeln ('Node not deleted.');
- end;
- 'D' : begin
- writeln ('balancing tree');
- BalanceTree (Root);
- writeln ('Tree balanced');
- end;
- 'E' : begin
- writeln ('rebuilding the tree');
- if Key_Field = 1
- then begin
- writeln ('switching to character keys');
- Key_Field := 2;
- RebuildTree (Root, Tree_Rebuilt, 1);
- end
- else begin
- writeln ('switching to integer keys');
- Key_Field := 1;
- RebuildTree (Root, Tree_Rebuilt, 2);
- end;
- if Tree_Rebuilt then writeln ('Tree rebuilt')
- else writeln ('Tree not rebuilt');
- end;
- 'F' : begin
- writeln ('starting inorder search');
- Inorder (Root);
- writeln ('inorder finished. press return');
- readln;
- end;
- 'G' : begin
- writeln ('starting preorder search');
- Preorder (Root);
- writeln ('preorder finished. press return');
- readln;
- end;
- 'H' : begin
- writeln ('starting postorder search');
- Postorder (Root);
- writeln ('postorder finished. press return');
- readln;
- end;
- 'I' : begin
- if Key_Field = 1
- then begin
- Key_Field := 2;
- writeln ('using characters as key');
- end
- else begin
- Key_Field := 1;
- writeln ('using integers as key');
- end;
- end;
- end; { case Option }
- until Option = 'X';
- Mark (Root);
- Release (Root);
- end.