带有父节点的二叉查找树实现
看来得要个父节点,因为后面的红黑树很需要啊!!
代码
#include <iostream>
using namespace std;
struct tree
{
int data;
tree *left,*right,*parent;
};
void tree_insert(tree *&, int);
//二叉查找树的初始化构建
void tree_init(tree *&T)
{
cout << "please input numbers of tree until the input is invalid" << endl;
int data = 0;
while (cin >> data)
{
tree_insert(T, data);
}
}
//插入
void tree_insert(tree * &T,int value)
{
if (T == NULL)
{
T = new tree();
T->data = value;
T->left = T->right = T->parent = NULL;
}
else
{
if (T->data > value)
{
tree_insert(T->left, value);
if (T->left)
T->left->parent = T;
}
else
{
tree_insert(T->right, value);
if (T->right)
T->right->parent = T;
}
}
}
//preorder to print the data of the whole tree
void tree_print1(tree *T)
{
if (T != NULL)
{
tree_print1(T->left);
cout << T->data << " ";
tree_print1(T->right);
}
}
//中序遍历
void tree_print2(tree *T)
{
if (T != NULL)
{
tree_print2(T->right);
cout << T->data << " " ;
tree_print2(T->left);
}
}
//后序遍历
void tree_print3(tree *T)
{
if (T != NULL)
{
cout << T->data << " ";
tree_print3(T->left);
tree_print3(T->right);
}
}
//find a value in the tree with the method of recursion
bool tree_search(tree *T, int value)
{
tree *t = T;
while (t != NULL)
{
if (t->data == value)
{
return true;
}
if(t->data < value)
t = t->right;
else
t = t->left;
}
return false;
}
//求最小值
tree * tree_mininum(tree *T)
{
while (T && T->left)
{
T = T->left;
}
return T;
}
//求后继结点
tree *tree_successor(tree *T)
{
if (!T->right)
{
return tree_mininum(T->right);
}
tree *y = T->parent;
while(y && T == y->right)
{
T = y;
y = y->parent;
}
return y;
}
//删除节点,不考虑性质
void del1(tree *&t)
{
if (t == t->parent->left)
{
if(!t->left && !t->right)
t->parent->left = NULL;
if(t->left != NULL)
t->parent->left = t->left;
if(t->right != NULL)
t->parent->left = t->right;
}
else
{
if(!t->left && !t->right)
t->parent->right = NULL;
if(t->left != NULL)
t->parent->right= t->left;
if(t->right != NULL)
t->parent->right = t->right;
}
}
//删除任意节点,并保持二叉查找树的性质
void tree_del(tree *T)
{
tree *y = NULL;
if (T->left == NULL || T->right == NULL)
{
y = T;
del1(T);
}
else
{
y = tree_successor(T);
T->data = y->data;
del1(y);
}
}
int main()
{
tree *T = NULL;
tree_init(T);
cout << "The number in the tree is :" << endl;
tree_print1(T);
cout << endl;
tree_print2(T);
cout << endl;
tree_print3(T);
int find_value = 0;
//cout << endl << "please input the number you want to find" <<endl;
cin.clear();
//cin >> find_value;
//cout << tree_search(T,find_value) << endl;
int del_data = 0;
cin >> del_data;
tree_del(T);
}