> # pragma hdrstop
typedef int TInfo;
typedef struct Item * PItem;
struct Item {
TInfo Key;
PItem Left, Right;
};
class TTree {
private:
PItem Root;
public:
TTree ();
void Add (TInfo Key);
void Del (TInfo Key);
void View ();
void Exist (TInfo Key);
~ TTree ();
};
// --------------------------------------------- ----------------
TTree :: TTree ()
{
Root = NULL;
}
// --------------------------------------------- ----------------
static void IniTree (PItem & P, TInfo X)// створення кореня дерева
{
P = new Item;
P-> Key = X;
P-> Left = NULL;
P-> Right = NULL;
}
static void Iendleft (PItem & P, TInfo X)// додавання вузла зліва
{
PItem R;
R = new Item;
R-> Key = X;
R-> Left = NULL;
R-> Right = NULL;
P-> Left = R;
}
static void InRight (PItem & P, TInfo X)// додати вузол праворуч
{
PItem R;
R = new Item;
R-> Key = X;
R-> Left = NULL;
R-> Right = NULL;
P-> Right = R;
}
static void Tree_Add (PItem P, TInfo X)
{
int OK;
OK = false;
while (! OK) {p> if (X> P-> Key)// подивитися направо
if (P-> Right! = NULL)// правий сайт не NULL
P = P-> Right;// обхід праворуч
else {//правий вузол - лист і треба додати до нього елемент
InRight (P, X);// і кінець
OK = true;
} p> else// подивитися ліворуч
if (P-> Left! = NULL)// лівий сайт не NULL
P = P-> Left;// обхід зліва
else {//лівий вузол-лист і треба додати до нього елемент
Iendleft (P, X);// і кінець
OK = true;
} p> }// Циклу while
}
void TTree :: Add (TInfo Key)
{
if (Root == NULL)
IniTree (Root, Key);
else Tree_Add (Root, Key);
}
// --------------------------------------------- ---------------- static void delete_ (PItem & P, TInfo X);
static void Del (PItem & R, PItem & Q)
// процедура видаляє вузол має двох нащадків, замінюючи його на самий правий
// вузол лівого піддерева
{
if (R-> Right! = NULL)// обійти дерево праворуч
Del (R-> Right, Q);
else {
// дійшли до самого правого вузла
// замінити цим вузлом видаляється
Q-> Key = R-> Key;
Q = R;
R = R-> Left;
} p>}// Del
static void delete_ (PItem & P, TInfo X)
{
PItem Q;
// Delete
if (P! = NULL)// Шукати видаляється вузол
if (X
Key)
delete_ (P-> Left, X);
else
if (X> P-> Key)
...