下面是我的程序 运行环境是vc6.0,我老是在随机建立二叉排序树时出现问题,删除节点有时成功有时不成功,拜托各位帮帮忙,谢谢了! 请帮我把出错的模块改过来,告诉我为什么我会出错,谢谢啦!
#include <stdio.h>
#include <stdlib.h>
# define queuemaxsize 20
# define stackmaxsize 10
typedef int elemtype;
struct btreenode
{
elemtype data;
struct btreenode *left;
struct btreenode *right;
};
void Insert1(struct btreenode* *bst,elemtype x)
/*插入元素递归算法,向二叉树插入一元素*/
{
if(*bst==NULL)/*在为空指针位置连接新节点*/
{
struct btreenode *p=malloc(sizeof(struct btreenode));
/*为P节点分配地址,P为btreenode结构体类型*/
p->data=x;
p->left=p->right=NULL;
*bst=p;/*P为根节点*/
}
if(x<(*bst)->data)
Insert1(&((*bst)->left),x);
/*递归算法向左子树插入元素*/
if(x>(*bst)->data)
Insert1(&((*bst)->right),x);
/*递归算法向子树插入元素*/
}
void Insert(struct btreenode* *bst,elemtype x)
/*插入元素非递归算法*/
{
struct btreenode *p;
/*定义变量*P为btreenode结构体类型*/
struct btreenode *t=*bst,*parent=NULL;
/*定义变量*t,*parent为btreenode结构体类型*/
while(t!=NULL)
{
parent=t;
if(x<t->data)
t=t->left;
else
t=t->right;
}
p=malloc(sizeof(struct btreenode));//分配空间给P
p->data=x;
p->left=p->right=NULL;
if(parent==NULL)
*bst=p;
else if (x<parent->data)
parent->left=p;
else parent->right=p;
}
void creatbstree1(struct btreenode **bst)
//随机输入数据建立二叉排序树
{
elemtype data;bst=NULL;
scanf(“%d”,&data);
while(data!=00)//以00作为结束
{
Insert1(&bst,data);
scanf(“%d”,&data);
}
}
void creatbstree(struct btreenode* *bst,elemtype a[],int n)
/*利用数组n个元素建立二叉树*/
{
int i;
*bst=NULL;
for(i=0;i<n;i++)
Insert1(bst,a[i]);
}
int Delete (struct btreenode* *bst,elemtype x)
/*从bst指针所指向的二叉树中删除节点x的递归算法*/
{
struct btreenode *temp;
//定义*temp为btreenode结构体类型的地址
temp=*bst;//temp的内容是*bst(也是内容)
if(*bst==NULL)
return 0;
if(x<(*bst)->data)
return Delete(&((*bst)->left),x);
/*删除左子树节点x的递归算法*/
if(x>(*bst)->data)
return Delete(&((*bst)->left),x);
/*删除右子树节点x的递归算法*/
if((*bst)->left==NULL)
//待删除元素为根节点且它的左子树是空
{
*bst=(*bst)->right; //将右子树作为整个子树并返回1
free(temp);
return 1;
}
else if((*bst)->right==NULL)
//待删除元素为根节点且它的右子树是空
{
*bst=(*bst)->left;//将左子树作为整个子树并返回1
free(temp);
return 1;
}
else
if((*bst)->left->right==NULL)//左右子树都不为空
{
(*bst)->data=(*bst)->left->data;
return Delete(&((*bst)->left),(*bst)->data);
}
else
if((*bst)->right->left==NULL)
{
struct btreenode *p1=*bst,*p2=p1->left;
while(p2->right!=NULL)
{
p1=p2;
p2=p2->right;
(*bst)->data=p2->data;
return Delete((&p1->right),p2->data);
}
}
}
void Inorder(struct btreenode *bst)
/*中序遍历递归算法*/
{
if(bst!=NULL)
{
Inorder(bst->left);
printf(“%d “,bst->data);
Inorder(bst->right);
}
}
elemtype* find(struct btreenode *bst,elemtype x)
//从二叉树中找等于给定值x的元素递归算法*/
{
if(bst==NULL)
return NULL;
else
{
if(x==bst->data)
return &(bst->data);
else if(x>bst->data)
return find(bst->right,x);
else if(x<bst->data)
return find(bst->left,x);
}
}
elemtype* find1(struct btreenode *bst,elemtype x)
/*查找元素的非递归算法*/
{
while(bst!=NULL)
{
if(x==bst->data)
return &(bst->data);
else if(x<bst->data)
bst=bst->left;
else bst=bst->right;
}
return NULL;
}
void printbtree(struct btreenode* btree)
/*广义表形式输出二叉树,其实是在中序遍历的递归算法上修改来的*/
{
if(btree!=NULL)
{
printf(“%d”,btree->data);
if(btree->left!=NULL||btree->right!=NULL)
{
printf(“(“);
printbtree(btree->left);
if(btree->right!=NULL)
printf(“,”);
printbtree(btree->right);
printf(“)”);
}
}
}
void main()
{
int p,m,x,*px;
int i,n;
int a[200];
struct btreenode *bst=NULL;
loop:
{
printf(“————————————————————-\n”);
printf(“0.利用数组建立二叉排序树\n”);
printf(“1.随机输入数据建立二叉排序树\n”);
printf(“2.退出:\n”);
printf(“————————————————————-\n”);
printf(“请输入您的选择“);
scanf(“%d”,&p);
switch(p)
{
case 0:
printf(“请输入数组元素个数“);
scanf(“%d”,&n);
printf(“请输入数组元素值\n”);
for(i=0;i<n;i++)
scanf(“%d”,&a[i]);
creatbstree(&bst,a,n);
printf(“相应操作后的中序遍历为\n”);
Inorder(bst);
printf(“\n”);
printf(“相应操作后的二叉树广义表形式为\n”);
printbtree(bst);
printf(“\n”);
break;
case 1:printf(“请输入元素(以00作为束)\n”);
creatbstree1(&bst);
printf(“相应操作后的中序遍历为\n”);
Inorder(bst);
printf(“\n”);
printf(“相应操作后的二叉树广义表形式为\n”);
printbtree(bst);
printf(“\n”);
break;
case 2:exit(0);
default: printf(“选择输入有误,请重新选择\n”);
printf(“————————————————————-\n”);
goto loop;
}
}
while(1)
{ printf(“————————————————————-\n”);
printf(“1.输入查找元素值\n”);
printf(“2.输入待插入元素的值:\n”);
printf(“3.输入待删除元素的值:\n”);
printf(“5.重新建立二叉树:\n”);
printf(“4.退出:\n”);
printf(“————————————————————-\n”);
printf(“请输入您的选择“);
scanf(“%d”,&m);
switch(m)
{
case 1:
printf(“输入查找元素值\n”);
scanf(“%d”,&x);
if(px=find(bst,x))
printf(“查找成功:%d\n”,*px);
else
printf(“查找失败\n”);
break;
case 2:
printf(“输入待插入元素的值:”);
scanf(“%d”,&x);
Insert1(&bst,x);
printf(“相应操作后的中序遍历为\n”);
Inorder(bst);
printf(“\n”);
printf(“相应操作后的二叉树广义表形式为\n”);
printbtree(bst);
printf(“\n”);
break;
case 3:
printf(“输入删除元素:”);
scanf(“%d”,&x);
if(x=Delete(&bst,x))
printf(“删除成功\n”);
else
printf(“删除失败\n”);
printf(“相应操作后的中序遍历为\n”);
Inorder(bst);
printf(“\n”);
printf(“相应操作后的二叉树广义表形式为\n”);
printbtree(bst);
printf(“\n”);
break;
case 4:exit(0);
case 5:goto loop;
default: printf(“选择输入有误,请重新选择\n”);
}
}
}
>> 本文固定链接: http://www.vcgood.com/archives/2728
>> 转载请注明: yinbinglengyue 2008年09月10日 于 C语言帝国 发表
void creatbstree1(struct btreenode **bst)
//随机输入数据建立二叉排序树
{
elemtype data;bst=NULL;
scanf(“%d”,&data);
while(data!=00)//以00作为结束
{
Insert1(&bst,data);
scanf(“%d”,&data);
}
}
这个里面有2个错误
1. bst=NULL ,应该是 *bst=NULL
2. Insert1(&bst,data); 应该是 Insert1(bst,data); // 这句在vc里面编译也
通不过 。
[QUOTE=xcgang]void creatbstree1(struct btreenode **bst)
//随机输入数据建立二叉排序树
{
elemtype data;bst=NULL;
scanf(“%d”,&data);
while(data!=00)//以00作为结束
{
Insert1(&bst,data);
scanf(“%d”,&data);
}
}
这个里面有2个错误
1. bst=NULL ,应该是 *bst=NULL
2. Insert1(&bst,data); 应该是 Insert1(bst,data); // 这句在vc里面编译也
通不过 。[/QUOTE]
谢谢你啊!
楼上的 应该是 *bst==NULL 吧?个人愚见.