#include "stdio.h"
#include "string.h"
#include "stdlib.h"
struct node //定义节点类型
{
int key;
node *left;
node *right;
};
node *insertBST(node *bt,int n);
void inorder(node *bt);
void main()
{
int n,i=0,j=0;
int a[100];
char num [5];
int number;
node *bt;
printf("请输入需要构建二叉排序树的数据\n每个数据间以空格隔开,输入完毕按回车结束\n\n");
do //输入回车前一直循环输入
{
n=getchar(); //输入每个字符的ASCII码
if(n>=48&&n<=57) //如果输入数字
{
num[i]=n; //将数字的ASCII码一个一个保存到字符串中
i++;
}
else //若输入的不是数字
{
num[i]='\0'; //结束字符串的输入
if(strlen(num)!=0) //若字符串长度不为0
{
number=atof(num); //将字符串转换为数字
a[j]=number; //将数字保存在数组a中
j++;
}
i=0; //字符串处理完毕,将字符串指针重置
}
if(n=='\n')
{
break; //输入回车符,退出
}
}while(n);
i=0;
bt=NULL;
for(i=0;i
printf("%d\n",a[i]);
bt=insertBST(bt,a[i]);
}
printf("\n二叉排序树构建完成:\n\n");
inorder(bt);
}
node *insertBST(node *p,int n)
{
if(p==NULL)
{
p=(node *)malloc(sizeof(node)); //第一次调用,将根节点指针域赋空
p->key=n;
p->left=p->right=NULL;
return p;
}
else if(n
p->left=insertBST(p->left,n); //输入值大于当前节点的值,在左子树中递归查找
else
p->right=insertBST(p->right,n); //输入值小于当前节点的值,在右子树中递归查找
return p;
}
void inorder(node *p)
{
if(p!=NULL)
{
inorder(p->left); //中序遍历左子树
printf("%d ",p->key);
inorder(p->right); //中序遍历右子树
}
}
如上已经修改可以运行了。
主要是
node *insertBST(node *p,int n)
{
if(p==NULL)
{
p=(node *)malloc(sizeof(node)); //第一次调用,将根节点指针域赋空
p->key=n;
p->left=p->right=NULL;
return p;
}
else if(n
return p->left=insertBST(p->left,n); //输入值大于当前节点的值,在左子树中递归查找
else
return p->right=insertBST(p->right,n); //输入值小于当前节点的值,在右子树中递归查找
return p;
}
它如果有返回值的,应该是一直返回的是二叉排序的根节点,而不是子树的根节点。
return p->left=insertBST(p->left,n);
这样返回的就是子树的根节点。这样
主函数中的bt指向的就不是整个二叉树的根节点了。而是子树的。所以你在
inorder(bt)它遍历的只是子树,而不是整个树了。
所以修改了。insertBST()函数的返回值。注意比较就行。
insertBST()函数修改如下:
node *insertBST(node *p,int n)
{
if(p==NULL)
{
p=(node *)malloc(sizeof(node));
p->key=n;
p->left=p->right=NULL;
/*注意这里*/
}
else if(n
p->left=insertBST(p->left,n); /*注意这里*/
else
p->right=insertBST(p->right,n); /*注意这里*/
return p; /*注意这里*/
}
do //输入回车前一直循环输入
{
n=getchar(); //输入每个字符的ASCII码
if(n>=48&&n<=57) //如果输入数字
{
num[i]=n; //将数字的ASCII码一个一个保存到字符串中
i++;
}
如果你想输入数字14怎么办?你这只能输入0~9吧