#include<iostream>
using namespace std;
typedef struct Node
{
Node* left;
Node* right;
Node* p;
int data;
Node(){}
Node(int dat) :data(dat){ left = right = NULL; }
}BT;
struct T
{
BT *root;
T(){ root = NULL; }
};
void Tree_Insert(T &tr, Node *z)
{
Node* y = NULL;
Node* x = tr.root;
while (x != NULL)
{
y = x;
if (z->data < x->data)
{
x = x->left;
}
else
x = x->right;
}
z->p = y;
if (y == NULL)
tr.root = z;
else if (z->data < y->data)
y->left = z;
else
y->right = z;
}
void Inorder_Tree_Walk(Node*x)
{
if (x != NULL)
{
Inorder_Tree_Walk(x->left);
cout << x->data << " ";
Inorder_Tree_Walk(x->right);
}
}
Node* Tree_Search(Node*x, int k)
{
if((NULL==x)|| (k == x->data))
return x;
if (k < x->data)
{
return Tree_Search(x->left, k);
}
else
return Tree_Search(x->right,k);
}
Node*Iterative_Tree_Search(Node*x, int k)
{
while ((x != NULL) || (k != x->data))
{
if (k < x->data)
x = x->left;
else
x = x->right;
}
return x;
}
Node*Tree_Minimun(Node*x)
{
while (x->left != NULL)
x = x->left;
return x;
}
Node*Tree_Maxinum(Node*x)
{
while (x->right!=NULL)
x = x->right;
return x;
}
void Transplant(T&tr, Node*u, Node*v)
{
if (u->p == NULL)
tr.root = v;
else if (u == u->p->left)
u->p->left = v;
else
u->p->right = v;
if (v != NULL)
v->p = u->p;
}
void Tree_Delete(T&tr, Node*z)
{
if (z->left == NULL)
Transplant(tr, z, z->right);
else if (z->right == NULL)
Transplant(tr,z,z->left);
else
{
Node*y = Tree_Minimun(z->right);
if (y->p != z)
{
Transplant(tr,y,y->right);
y->right = z->right;
y->right->p = y;
}
Transplant(tr,z,y);
y->left = z->left;
y->left->p = y;
}
}
int main()
{
T t;
Node *n1 = new Node(1);
Node *n2 = new Node(3);
Node *n3 = new Node(2);
Tree_Insert(t,n1);
Tree_Insert(t,n2);
Tree_Insert(t,n3);
Inorder_Tree_Walk(t.root);
cout << "\n";
Node*s=Tree_Search(t.root,3);
cout << s->data << endl;
Node*min = Tree_Minimun(t.root);
cout <<"min:\t"<< min->data << endl;
Node*max = Tree_Maxinum(t.root);
cout << "max:\t" << max->data << endl;
Tree_Delete(t,n3);
Tree_Delete(t, n1);
Inorder_Tree_Walk(t.root);
cout << "\n";
}