#include <cstdlib>
#include <iostream>
#define N 10
using namespace std;
typedef struct node *link;
struct node {
int item;
link l,r;
};
link NODE(int item,link l,link r)
{
link t = (link)malloc(sizeof(struct node));
t->item = item;
t->l = l;
t->r = r;
return t;
}
link insert_node(link t,int item)
{
if(t == NULL) return NODE(item,NULL,NULL);
if(item < t->item)
t->l = insert_node(t->l,item);
else
t->r = insert_node(t->r,item);
return t;
}
//中序打印
void inOrder(link root){
if(root){
inOrder(root->l);
cout<<root->item<<" ";
inOrder(root->r);
}
}
link bst_remove(link t,int item)
{
if(t == NULL) return NULL; //没找到,不做操作
if(item < t->item)//小于,向左找
t->l = bst_remove(t->l,item);
else if(item > t->item)//大于。向右找
t->r = bst_remove(t->r,item);
else {//等于,做操作
link x;
if(t->l){//左子树不为空,在左子树取最大值替换当前需要删除的点
for(x = t->l;x->r;x= x->r){;}//最大值在右边,x指向最大的节点(叶节点)
t->item = x->item; //把x拿上去;
t->l = bst_remove(t->l,t->item);
}
else if(t->r){//左子树为空。
for(x = t->r;x->l;x = x->l){;}//最小值在左边 ,x指向最小的节点(叶节点)
t->item = x->item;//把x拿上去
t->r = bst_remove(t->r,t->item);
}
else{//既没有左子树,又没有右子树,直接删除
free(t);
t = NULL;
}
}
return t;//t为树的根节点
}
int main(int argc, char *argv[])
{
srand(time(NULL));
link root = NULL;
int a[] = {1,40,20,11,9,5,17,18,88,29};
for(int i =0;i<N;i++)
{
root = insert_node(root,a[i]);
}
inOrder(root);
cout<<endl;
root = bst_remove(root ,18);
inOrder(root);
system("PAUSE");
return EXIT_SUCCESS;
}