| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 577 人关注过本帖
标题:[求助]怎样删除2叉树节点?
只看楼主 加入收藏
怪兽仔
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2007-7-3
收藏
 问题点数:0 回复次数:0 
[求助]怎样删除2叉树节点?

#include<stdio.h>
#include<stdlib.h>
/*定义结构体*/
typedef int ElemType;
typedef struct node
{
ElemType data;
struct node *lch,*rch;
}Snode;
/*定义各方法*/
Snode *creat_bt();
Snode *insert(Snode *t,Snode *s);
void inorder(Snode *p);
void delet(Snode *t,int key);
void bstsrch(Snode *root,Snode *p,Snode *q,int K);
/*实现主菜单*/
main()
{
Snode *H=NULL,*P=NULL,*Q=NULL,*L=NULL,*M=NULL;int cord,n;
do{
printf("\n 主菜单");
printf("\n 1.建立二叉排序树");
printf("\n 2.中根遍历二叉树");
printf("\n 3.查找二叉排序树");
printf("\n 4.删除二叉树排序树的结点");
printf("\n 5.结束程序运行");
printf("\n============================");
printf("\n 请输入您的选择(1,2,3,4,5):");
scanf("%d",&cord);
switch(cord)
{
case 1:H=creat_bt(); break;
case 2:printf("\n 中序遍历输出");inorder(H); break;
case 3: printf("\n 请输入您要查找的数:");
scanf("%d",&n);
bstsrch(H,P,Q,n); break;
case 4: printf(" 请输入您要删除的结点:");
scanf("%5d",&n);
delet(H,n);
printf("\n 操作后的二叉排序树是:");
inorder(H);break;
case 5:exit(0);
}
}while(cord<=5);
}
/*建立二叉排序树*/
Snode *creat_bt()
{
Snode *t0,*s;int n,i;ElemType k;
printf("\n n=");scanf("%d",&n);
t0=NULL;
for(i=1;i<=n;i++)
{
printf("\n %d key=",i);scanf("%d",&k);
s=(Snode *)malloc(sizeof(Snode));
s->data=k;s->lch=NULL;s->rch=NULL;
t0=insert(t0,s);
}
return(t0);
}
/*插入数据*/
Snode *insert(Snode *t,Snode *s)
{
if(t==NULL) t=s;
else if(s->data<t->data)
t->lch=insert(t->lch,s);
else t->rch=insert(t->rch,s);
return(t);
}
/*中根遍历二叉树*/
void inorder(Snode *p)
{
if(p!=NULL)
{
inorder(p->lch);//递归输出左子树
printf("%8d",p->data);//输出根结点
inorder(p->rch);//递归输出右子树
}
}
/*查找二叉排序树*/
void bstsrch(Snode *root,Snode *p,Snode *q,int K)
{

int flag;
p=NULL;q=root;
flag=0;
while((q!=NULL)&&(flag==0))
if(q->data==K)
{
printf(" succ %5d",q->data);flag=1;
}
else if(K<q->data)
{
p=q;q=q->lch;
}
else
{
p=q;
q=q->rch;
}
if(flag==0) printf("NO node");
}
/*删除结点*/
void delet(Snode *t,int key)
{
int bool=1;
Snode *q=NULL,*s=NULL,*p=NULL,*f=NULL;
bstsrch(t,f,p,key);
while(p!=NULL){
if(p->lch==NULL) s=p->rch;
else if(p->rch==NULL) s=p->lch;
else{
q=p;s=p->rch;
while(s->lch!=NULL){q=s;s=s->lch;}
if(q==p) q->rch=s->rch;
else q->lch=s->rch;
p->data=s->data;
free(s);bool=0;
}
if(bool==1)
{
if(f==NULL) t=s;
else if(f->lch==p) f->lch=s;
else f->rch=s;
free(p);
}
}
}


不知道为什么我运行时,删除结点,出现了问题.请高手指教,并帮小弟修改一下删除结点的代码.在此多谢!

搜索更多相关主题的帖子: 节点 删除 
2007-07-03 11:05
快速回复:[求助]怎样删除2叉树节点?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021222 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved