【问题描述】
请根据输入的数据创建一棵二叉排序树。然后执行相应操作。
1 删除某一值为x的结点
2 求指定结点y在二叉排序树中的层数
【输入形式】
结点数据,以0代表结束输入。
待删除的x,待求层数的y
【输出形式】
删除后的二叉排序树的中序遍历结果
y所在的层数
【样例输入】
29 39 15 25 28 10 11 2 0
10
11
【样例输出】
2 11 15 25 28 29 39
4
【样例说明】若待删除的结点包含左右子树,则以其左子树的最右结点代替它。
#include <bits/stdc++.h>
using namespace std;
#define maxv 100
typedef struct node
{
int val;
struct node *lc,*rc;
}*btree,bnode;
void InOrder(btree);
void insertb(btree * p,int k)
{
btree s;
if(*p==0)
{
s=(btree)malloc(sizeof(bnode));
s->val=k;
s->lc=0;
s->rc=0;
*p=s;
}
else if(k<(*p)->val)
insertb(&((*p)->lc),k);
else if(k>(*p)->val)
insertb(&((*p)->rc),k);
}
void creat(btree *b)
{
int i=0,k;
*b=0;
while(1)
{
cin>>k;
if(k==0)
break;
insertb(b,k);
}
}
btree srch(btree bt,int k)
{
if(!bt)
return 0;
else if(bt->val==k)
return bt;
else if(bt->val>k)
return srch(bt->lc,k);
else
return srch(bt->rc,k);
}
bnode* del(btree t,int k)
{
bnode *p,*f,*s,*q;
p=t;
f=0;
while(p)
{
if(p->val==k)//找到,跳出循环
break;
f=p;
if(p->val>k)
p=p->lc;
else
p=p->rc;
}
if(p==0)
return t;//找不到
if(p->lc==0)//p无左子树
{
if(f==0)
t=p->rc;
else if(f->lc==p)
f->lc=p->rc;
else
f->rc=p->rc;
free(p);
}
else //p有左子树
{
q=p;
s=p->lc;
while(s->rc)
{
q=s;
s=s->rc;
}
if(q==p)
q->lc=s->lc;
else
q->rc=s->lc;
p->val=s->val;
free(s);
}
return t;
}
void level(btree t,int k)
{
int i=1;
while(t!=0)
{
if(t->val==k)
{
cout<<i<<endl;
break;
}
else if(t->val>k)
t=t->lc;
else
t=t->rc;
i++;
}
}
void InOrder(btree root)
{
if(root!=NULL)
{
InOrder(root->lc);
cout<<root->val<<' ';
InOrder(root->rc);
}
}
int main()
{
btree bt; creat(&bt);
//InOrder(bt); //cout<<endl;
int k; cin>>k;
bt=del(bt,k);
InOrder(bt); cout<<endl;
cin>>k; level(bt,k);
return 0;
}