永发信息网

求助,二叉树删除结点问题

答案:1  悬赏:40  手机版
解决时间 2021-05-12 23:06

这是二叉树遍历的应用,我的删除结点的操作为什么没执行那?请各位帮忙看看哪里出问题了,谢谢了

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

typedef int ElemType;
typedef struct BitNode
{
ElemType data;
struct BitNode *lchild,*rchild;
}BitNode,*BitTree;

BitTree CreateBiTree(void)
{
BitTree bt;
ElemType x;
scanf("%d",&x);
if(x==-1)
bt=NULL; //安排空指针
else
{
bt=(BitTree)malloc(sizeof(BitNode));
bt->data =x; //生成新结点
bt->lchild =CreateBiTree(); //建立左子树
bt->rchild =CreateBiTree(); //建立右子树
}
return bt; //返回根节点指针
}


void InOrderTraverse(BitTree bt) //中序遍历
{
if(bt!=NULL)
{
InOrderTraverse(bt->lchild);
printf("%4d",bt->data);
InOrderTraverse(bt->rchild);
}
}

int n=0;
int leafcount(BitTree bt)
{
if(bt!=NULL)
{
if(bt->lchild==NULL&&bt->rchild==NULL)
n++;
leafcount(bt->lchild);
leafcount(bt->rchild);
}
return n;
}

BitTree exchangetree(BitTree bt)
{
BitTree t;
if(bt!=NULL)
{
if(bt->lchild!=NULL||bt->rchild!=NULL)
{
t=bt->lchild;bt->lchild=bt->rchild;bt->rchild=t;
}
bt->lchild=exchangetree(bt->lchild);
bt->rchild=exchangetree(bt->rchild);
}
return bt;
}

int hightree(BitTree bt)
{
int H,H1,H2;
if(bt==NULL)
H=0;
else
{
H1=hightree(bt->lchild);
H2=hightree(bt->rchild);
H=(H1>H2?H1:H2)+1;
}
return H;
}

int find=0;

void searchtree(BitTree bt,ElemType x,BitTree *p,BitTree *f)
{
if(bt!=NULL&&!find)
if(bt->data==x)
{
find=1;*p=bt;
}
else
{
*f=bt;
searchtree(bt->lchild,x,p,f);
*f=bt;
searchtree(bt->rchild,x,p,f);
}
}

void deltree(BitTree bt,ElemType x)
{
BitTree p,f,q,s;
p=f=NULL;
searchtree(bt,x,&q,&f);
if(p!=NULL)
if(p->lchild!=NULL)
{
q=p->lchild;
s=q;
while(s->rchild!=NULL)
{
q=s;s=s->rchild;
}
if(s!=q)
q->rchild=s->lchild;
else
p->lchild=q->lchild;
p->data=s->data;
free(s);

}
else
{
if(f!=NULL)
if(p==f->lchild)
f->lchild=p->rchild;
else
f->rchild=p->rchild;
else
bt=bt->rchild;
free(p);
}
else
printf("结点x在二叉树中不存在!\n");
}

void main()
{
BitTree bt=NULL,p,f;
ElemType x;
int count=0,high=0;
bt=CreateBiTree();
printf("中序遍历:\n");
InOrderTraverse(bt);
printf("\n叶子节点的个数:\n");
count=leafcount(bt);
printf("%4d",count);
printf("\n交换左右子树:\n");
exchangetree(bt);
InOrderTraverse(bt);
printf("\n删除结点x=");
scanf("%d",&x);
searchtree(bt,x,&p,&f);
printf("\n");
InOrderTraverse(bt);
printf("\n");
getch();
}

最佳答案

searchtree(bt,x,&p,&f);
这里写的应该是del的函数调用


另外你的searchtree(bt,x,&q,&f);
函数里的&q应该是&p


你好好想想吧~~·

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
k834次列车早晨5:48开多久能到株洲?
阿凡达经典台词,危情谍战的经典台词(英文版
想找 风格独特、言简意赅、艺术精湛的抒情心
心里想的人己经不想你了,你为什么还要想他,那
安卓怎么禁止安装软件,如何用注册表禁止安装
骨头断了应该吃什么
QQ炫舞购物券怎么花啊?
土豆网的小屏幕变大了,怎么才可以变回原样啊
宝鸡的小吃特产有哪些,宝鸡的特产小吃
篮球,赛车,游戏
MFC在程序中判断窗口是否已经运行
哪种胎压监测好,装胎压监测有必要吗一般装哪
请问在景德镇当黄金导购员一般一个月工资可以
科比几岁得的24000分
到纬二路147号坐几路公交车?哪一个站下车?
推荐资讯
E63用什么打字法好?
QQ炫舞中“星级舞者”是怎么定义的?
启动电容起什么作用大神们,
周冲路在什么地方啊,我要过去处理事情
电话号码怎么拉黑名单,怎样把不想接的电话号
家用冰箱哪个好 具体型号?节能 静音可以冰镇
如何让手机网速提高,怎么让手机网速更强。
关于善有善报的名言,关示善有善报,恶有恶报同
颜如玉和谁是情侣?
为什么女人有爱才有性,而男人求其一个女人都
如何点亮QQ宠物图标?
爱他去不能和他见面怎么办?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?