PROGRAM 3
// PROGRAM: PROGRAM3.CPP AUTHOR: ANTHONY F. ORTIZ
#include
#include
#include
#include
// DELCARATION OF TREE NODE CLASS.
template
class TREE_NODE
{
protected:
// KEY INFORMATION.
ETYPE ELEMENT;
// RIGHT AND LEFT POINTERS.
TREE_NODE * LEFT;
TREE_NODE * RIGHT;
// TREE_NODE CONSTRUCTOR.
TREE_NODE (ETYPE E = 0, TREE_NODE * L = 0, TREE_NODE * R = 0) :
ELEMENT (E), LEFT (L), RIGHT (R) {}
// HEIGHT OF A NODE IN A TREE.
friend int HEIGHT (TREE_NODE * T);
// A CLASS CALLED BINARY_SEARCH_TREE WILL USE THE TREE NODE
// CLASS.
friend class BINARY_SEARCH_TREE ;
};
// DELCARATION OF BINARY SEARCH TREE CLASS.
template
class BINARY_SEARCH_TREE
{
// THESE PROCEDURES WILL BE CALLED BY THE PUBLIC ONES OF THE SAME
// NAME.
protected:
// MAKE AN EMPTY TREE.
void MAKE_EMPTY (TREE_NODE * & T);
// INSERT AN ELEMENT INTO A TREE.
void INSERT (const ETYPE & X, TREE_NODE * & T);
// REMOVE AN ELEMENT FROM A TREE.
void REMOVE (const ETYPE & X, TREE_NODE * & T);
// PRINT THE TREE USING A INORDER TRAVERSAL.
// THIS WILL PRINT IT IN SORTED ORDER.
void PRINT_TREE (TREE_NODE * T) const;
// COPY A TREE.
TREE_NODE * COPY (const TREE_NODE * T);
// FIND AN ELEMENT IN THE TREE.
TREE_NODE * FIND (const ETYPE & X, TREE_NODE * T) const;
// FIND THE MINIMUM ELEMENT IN THE TREE.
TREE_NODE * FIND_MIN (TREE_NODE * T) const;
// FIND THE MAXIMUM ELEMENT IN THE TREE.
TREE_NODE * FIND_MAX (TREE_NODE * T) const;
// ROOT OF THE TREE.
TREE_NODE * ROOT;
// THE LAST FIND IN A FIND ROUTINE.
TREE_NODE * LAST_FIND;
// THESE PROCEDURES WILL CALL THE PROTECTED ONES.
public:
// CONSTRUCTORS.
BINARY_SEARCH_TREE () : ROOT (0), LAST_FIND (0) {}
// ERROR MESSAGE WHEN PASS BY VALUE.
BINARY_SEARCH_TREE (BINARY_SEARCH_TREE & VALUE)
{cout << "TREE PASSED BY VALUE."; operator = (VALUE);}
// DESTRUCTOR.
virtual ~BINARY_SEARCH_TREE ()
{MAKE_EMPTY (ROOT); ROOT = LAST_FIND = 0;}
// OPERATORS.
// COPY A TREE.
const BINARY_SEARCH_TREE & operator = (const BINARY_SEARCH_TREE & VALUE);
// RETURN A TREE ELEMENT.
ETYPE operator () () const
{return LAST_FIND != 0 ? LAST_FIND -> ELEMENT : 0;}
// MEMBER FUNCTIONS.
// CALL MAKE_EMPTY AND ASSIGN 0 TO ROOT AND LAST FIND.
void MAKE_EMPTY ()
{MAKE_EMPTY (ROOT); ROOT = LAST_FIND = 0;}
// CALL PRINT_TREE.
void PRINT_TREE () const
{PRINT_TREE (ROOT);}
// ASSIGN LAST_FIND TO THE FUNCTION FIND.
virtual int FIND (const ETYPE & X)
{return int (LAST_FIND = FIND (X, ROOT));}
// ASSIGN LAST_FIND TO THE FUNCTION FIND_MIN.
virtual int FIND_MIN ()
{return int (LAST_FIND = FIND_MIN (ROOT));}
// ASSIGN LAST_FIND TO THE FUNCTION FIND_MAX.
virtual int FIND_MAX ()
{return int (LAST_FIND = FIND_MAX (ROOT));}
// CALL INSERT.
virtual void INSERT (const ETYPE & X)
{INSERT (X, ROOT);}
// CALL REMOVE.
virtual void REMOVE (const ETYPE & X)
{REMOVE (X, ROOT);}
};
// COPY A TREE USING '=' OPERATOR.
template
const BINARY_SEARCH_TREE &
BINARY_SEARCH_TREE ::
operator = (const BINARY_SEARCH_TREE & VALUE)
{
if (this != & VALUE)
{
MAKE_EMPTY (ROOT);
ROOT = COPY (VALUE.ROOT);
LAST_FIND = ROOT;
}
return * this;
}
// COPY THE TREE.
template
TREE_NODE *
BINARY_SEARCH_TREE ::
COPY (const TREE_NODE * T)
{
if (T != 0)
return new TREE_NODE (T -> ELEMENT, COPY (T -> LEFT), COPY (T -> RIGHT));
else
return 0;
}
// MAKE THE TREE EMPTY.
template
void
BINARY_SEARCH_TREE ::
MAKE_EMPTY (TREE_NODE * & T)
{
if (T != 0)
{
MAKE_EMPTY (T -> LEFT);
MAKE_EMPTY (T -> RIGHT);
delete T;
T = 0;
}
}
// FIND AN ELEMENT IN THE TREE.
template
TREE_NODE *
BINARY_SEARCH_TREE ::
FIND (const ETYPE & X, TREE_NODE * T) const
{
if (T == 0)
return 0;
else
if (X < T -> ELEMENT)
return FIND (X, T -> LEFT);
else
if (X > T -> ELEMENT)
return FIND (X, T -> RIGHT);
else
return T;
}
// FIND THE MINIMUM ELEMENT IN THE TREE.
template
TREE_NODE *
BINARY_SEARCH_TREE ::
FIND_MIN (TREE_NODE * T) const
{
if (T == 0)
return 0;
else
if (T -> LEFT == 0)
return T;
else
return FIND_MIN (T -> LEFT);
}
// FIND THE MAXIMUM ELEMENT OF A TREE.
template
TREE_NODE *
BINARY_SEARCH_TREE ::
FIND_MAX (TREE_NODE * T) const
{
if (T == 0)
return 0;
else
if (T -> RIGHT == 0)
return T;
else
return FIND_MAX (T -> RIGHT);
}
// INSERT AN ELEMENT INTO THE TREE.
template
void
BINARY_SEARCH_TREE ::
INSERT (const ETYPE & X, TREE_NODE * & T)
{
if (T == 0)
{
T = new TREE_NODE (X);
if (T == 0)
cout << "OUT OF SPACE.";
}
else
if (X < T -> ELEMENT)
INSERT (X, T -> LEFT);
else
if (X > T -> ELEMENT)
INSERT (X, T -> RIGHT);
// ELSE X IS IN THE TREE ALREADY AND DO NOTHING.
}
// REMOVE AN ELEMENT FROM THE TREE.
template
void
BINARY_SEARCH_TREE ::
REMOVE (const ETYPE & X, TREE_NODE * & T)
{
TREE_NODE * TMP_CELL;
if (T == 0)
cout << "ELEMENT NOT FOUND.";
else
if (X < T -> ELEMENT) // GO LEFT.
REMOVE (X, T -> LEFT);
else
if (X > T -> ELEMENT) // GO RIGHT.
REMOVE (X, T -> RIGHT);
else // FOUND ELEMENT TO BE REMOVED.
if (T -> LEFT != 0 && T -> RIGHT != 0) // TWO CHILDREN.
{
// REPLACE WITH SMALLEST IN RIGHT SUBTREE.
TMP_CELL = FIND_MIN (T -> RIGHT);
T -> ELEMENT = TMP_CELL -> ELEMENT;
REMOVE (T -> ELEMENT, T -> RIGHT);
}
else // ONE OR ZERO CHILD.
{
TMP_CELL = T;
if (T -> LEFT == 0) // ONLY A RIGHT CHILD.
T = T -> RIGHT;
else
if (T -> RIGHT == 0) // ONLY A LEFT CHILD.
T = T -> LEFT;
delete TMP_CELL;
}
}
// PRINT THE TREE USING AN INORDER TRAVERSAL.
// THIS WILL PRINT IT IN SORTED ORDER.
template
void
BINARY_SEARCH_TREE ::
PRINT_TREE (TREE_NODE * T) const
{
if (T != 0)
{
PRINT_TREE (T -> LEFT);
cout << HEIGHT (T) << " " << T -> ELEMENT << " ";
PRINT_TREE (T -> RIGHT);
}
}
// CALCULATE THE HEIGHT OF A NODE.
template
int
HEIGHT (TREE_NODE * T)
{
if (T == 0)
return -1;
else
return 1 + MAX (HEIGHT (T -> LEFT), HEIGHT (T -> RIGHT));
}
int
MAX (int A, int B)
{
if (A > B)
{
return A;
}
else
{
return B;
}
}
// THIS PROGRAM WILL INSERT 40 RANDOM INTEGERS FROM 1000 TO 10000 INTO
// A BINARY SEACH TREE AND PRINT THEM IN ASCENDING ORDER. THEN, IT
// WILL DELETE 20 ELEMENTS FROM THE TREE, PRINTING THE NEW TREE EVERY
// FORTH REMOVAL.
int main ()
{
// CLEAR SCREEN.
clrscr ();
// DECLARE VARIABLE FOR A BINARY SEARCH TREE OF INTEGERS.
// IT WILL HOLD THE 40 RANDOM INTEGERS.
BINARY_SEARCH_TREE INTEGER_TREE;
// HOLDS THE CURRENT RANDOM NUMBER.
int RANDOM_NUMBER;
// HOLDS THE CURRENT RANDOM NUMBER. NEEDED FOR REMOVAL.
int TEMP;
// HOLDS THE 40 RANDOM INTEGERS.
// THIS WILL BE USED FOR DELETION.
int RANDOM_ARRAY [40];
// INSERT 40 RANDOM INTEGERS FROM 1000 TO 10000 INTO THE TREE.
for (int I = 0; I <= 39; I++)
{
// GET RANDOM NUMBER.
RANDOM_NUMBER = (rand () % 9000) + 1000;
// INSERT IT INTO THE TREE.
INTEGER_TREE.INSERT (RANDOM_NUMBER);
// ALSO, INSERT IT INTO AN ARRAY.
RANDOM_ARRAY [I] = RANDOM_NUMBER;
}
// PRINT A HEADING AND THEN THE TREE.
cout << "AFTER 40 INSERTIONS:\n\n";
INTEGER_TREE.PRINT_TREE ();
// PAUSE SO USER CAN SEE THE SCREEN.
delay (5000);
// REMOVE 20 ELEMENTS FROM THE TREE.
for (int J = 0; J <= 19; J++)
{
// LOOP IF THE RANDOM NUMBER IS NOT IN THE ARRAY.
// THIS MIGHT HAPPEN IF IT HAS BEEN REMOVED FROM
// TREE AND ARRAY.
do
{
// RANDOM NUMBER FROM 0 TO 39.
// INDEX OF THE ARRAY.
RANDOM_NUMBER = (rand () % 40);
}
while (RANDOM_ARRAY [RANDOM_NUMBER] == 0);
// HOLD THE RANDOM NUMBER.
TEMP = RANDOM_ARRAY [RANDOM_NUMBER];
// PUT 0 IN THE ARRAY OF THE APPROPRIATE INDEX.
RANDOM_ARRAY [RANDOM_NUMBER] = 0;
// PUT THE RANDOM NUMBER IN THE TEMP VARIABLE INTO
// THE RANDOM NUMBER VARIABLE.
RANDOM_NUMBER = TEMP;
// REMOVE THE RANDOM NUMBER.
INTEGER_TREE.REMOVE (RANDOM_NUMBER);
// WRITE A HEADING AND SHOW THE NEW TREE.
if ((J + 1) % 4 == 0)
{
cout << "\n\nAFTER 4 DELETIONS:\n\n";
INTEGER_TREE.PRINT_TREE ();
// PAUSE SO USER CAN SEE THE SCREEN.
delay (5000);
}
}
return 0;
}
// OUTFILE: PROG3.OUT
AFTER 40 INSERTIONS:
1 1004 0 1119 2 1130 11 1346 1 1492 0 1509 3 2090 2 2360
0 2651 1 2816 10 2982 9 3656 0 4252 4 4571 3 4681 2 4734
1 4979 0 4995 5 5126 1 5214 0 5310 2 5441 3 5463 4 5879
6 5948 0 5985 1 6412 2 6558 0 6593 1 6779 7 7415 0 7561
1 8047 0 8092 8 8117 1 8190 0 9571 2 9595 1 9721 0 9995
AFTER 4 DELETIONS:
1 1004 0 1119 2 1130 11 1346 1 1492 0 1509 3 2090 2 2360
0 2651 1 2816 10 2982 9 3656 4 4571 3 4681 2 4734 1 4979
0 4995 5 5310 0 5441 1 5463 2 5879 6 5985 0 6412 2 6558
0 6593 1 6779 7 7415 0 7561 1 8047 0 8092 8 8117 1 8190
0 9571 2 9595 1 9721 0 9995
AFTER 4 DELETIONS:
1 1004 0 1119 2 1130 9 1346 1 1492 0 1509 3 2090 2 2360
0 2651 1 2816 8 2982 3 4681 2 4734 1 4979 0 4995 4 5310
0 5441 1 5463 2 5879 5 6412 2 6558 0 6593 1 6779 6 7415
0 7561 1 8047 0 8092 7 8117 1 8190 0 9571 2 9721 0 9995
AFTER 4 DELETIONS:
0 1004 1 1130 9 1346 1 1492 0 1509 2 2090 1 2360 0 2816
8 2982 3 4681 2 4734 1 4979 0 4995 4 5310 0 5441 1 5463
2 5879 5 6412 2 6558 0 6593 1 6779 6 7415 0 7561 1 8047
7 8117 0 8190 1 9721 0 9995
AFTER 4 DELETIONS:
0 1004 1 1130 8 1346 0 1509 2 2090 1 2360 0 2816 7 4681
2 4734 1 4979 0 4995 3 5441 0 5463 1 5879 4 6412 1 6558
0 6593 5 7415 0 7561 1 8047 6 8117 0 8190 1 9721 0 9995
AFTER 4 DELETIONS:
0 1004 1 1130 7 1346 0 1509 1 2090 0 2360 6 4734 1 4979
0 4995 2 5463 0 5879 3 6412 1 6558 0 6593 4 7415 0 8047
5 8117 0 8190 1 9721 0 9995
BACK TO CS3240 PAGE.