缺点还是有的-不平衡。
混了2天终于把代码写出来了,算法导论真是本好书啊
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct point {
struct point *r,*l,*p;
int key;
}point;
point *head,*p,node[100];//head:头指针
int num;
void init()
{
head=p=NULL;
num=0;
memset(node,'\0',sizeof(node));
}
void insert(point* &head,int x)
{
if(head==NULL)
{
node[num].key=x;
node[num].p=p;
head=&node[num++];
return;
}
p=head;
if(head->key>x)
insert(head->l,x);
else
insert(head->r,x);
}
//引用了以后可以再函数里面改变变量的值
//如下面的head不需要改变就没有引用
void inOrderTraver(point *head)
{
if(head==NULL)
return ;
inOrderTraver(head->l);
printf("%d ",head->key);
inOrderTraver(head->r);
}
point* TreeSearch(point* &head,int k)//查找关键字为k的节点,返回指针
{
if(head==NULL||k==head->key)
return head;
if(k<head->key)
TreeSearch(head->l,k);
else
TreeSearch(head->r,k);
}
point *TreeSearch2(point* head,int k)//查找,非递归版本,运行时间快,不至于栈溢出。
{
point *tmp;
tmp=head;
while(tmp!=NULL&&k!=tmp->key)
{
if(k<tmp->key)
tmp=tmp->l;
else
tmp=tmp->r;
}
return tmp;
}
point* MINIMUM(point* head)
{
point* tmp=head;
while(tmp->l!=NULL)
{
tmp=tmp->l;
}
return tmp;
}
point* MAXIMUM(point* head)
{
point* tmp=head;
while(tmp->r!=NULL)
tmp=tmp->r;
return tmp;
}
point* TreeSuccessor(point* tmp)//球后继。
{
if(tmp->r !=NULL)
{
return MINIMUM(tmp->r);
}
point* y=tmp->p;
while(y!=NULL&&tmp==y->r)
{
tmp=y;
y=y->p;
}
return y;
}
point* deleteBST(point* &head,int k)
{
point *z,*y,*x;
z=TreeSearch2(head,k);
if(z->l==NULL||z->r==NULL)//z 至少有一个为空
y=z;
else
y=TreeSuccessor(z);//z有2个子女的话,y指向其前驱
if(y->l!=NULL) //y的左子树不空,x指向y的子女
x=y->l;
else
x=y->r;
if(x!=NULL)//即y有子女
x->p=y->p;
if(y->p==NULL)//如果y是根节点
head=x;
else if(y==y->p->l)
y->p->l=x;
else y->p->r=x;
if(y!=z)
z->key=y->key;
return y;
}
//1.该节点z没有子女,将它删除即可
//2.如果z有一个子女则删除z
//3.如果z有2个子女,则删除其后继y,它至多有一个子女,接着用y替换z.
int main()
{
int x,k;
point *tmp,*tt;
init();
while(~scanf("%d",&x))//构树,输入EOF结束
insert(head,x);
inOrderTraver(head);//中序输出
putchar('\n');
scanf("%d",&k);
tmp=TreeSearch(head,k);
if(tmp==NULL) printf("SEARCH FAILED NO NUMBER!\n");//二叉树中无此数。
else
printf("%d\n",tmp->key);
inOrderTraver(head);//中序输出
putchar('\n');
tmp=MINIMUM(head);
printf("MINIMUM: %d\n",tmp->key);
tmp=MAXIMUM(head);
printf("MAXIMUM: %d\n",tmp->key);
scanf("%d",&k);
tmp=TreeSearch(head,k);
tt=TreeSuccessor(tmp);
printf("%d后继:%d\n",k,tt->key);//查找后继
scanf("%d",&k);//输入将被删除数
tt=deleteBST(head,k);
printf("%d\n",tt->key);
inOrderTraver(head);//中序输出
putchar('\n');
return 0;
}
