二叉排序树的建立与前序 中序 后序输出
输入数据建立一个二叉排序树,按照前序、中序后序输出,这是我写的代码,我看了好久不知道错哪了。但是运行结果仿佛贼错。
输入的数据根据顺序输出的数据个数都不一定
#include <stdio.h>
#include <stdlib.h>
struct Node
{
Node *lchild;
Node *rchild;
int num;
};//定义结点类型便于创建树
void preOrder(Node *T)
{
printf("%d ",T->num);
if (T->lchild != NULL)
{
preOrder(T->lchild);
}
if (T->rchild)
{
preOrder(T->rchild);
}
}//前序遍历
void inOrder(Node *T)
{
if (T->lchild != NULL)
{
preOrder(T->lchild);
}
printf("%d ",T->num);
if (T->rchild)
{
preOrder(T->rchild);
}
}//中序遍历
void postOrder(Node *T)
{
if (T->lchild != NULL)
{
preOrder(T->lchild);
}
if (T->rchild)
{
preOrder(T->rchild);
}
printf("%d ",T->num);
}//后序遍历
Node *Insert(Node *T,int x)
{//插入数字x
if (T == NULL)
{//树为空
T = (Node*)malloc(sizeof(Node));//申请一个结点空间作为根节点
T->lchild = NULL;
T->rchild = NULL;
T->num = x;
return T;
}
else if (x < T->num)
{//插入T的左子树
T->lchild = Insert(T->lchild,x);
}
else if (x > T->num);
{//插入T的右子树
T->rchild = Insert(T->rchild,x);
}
return T;//返回根节点指针
}
void deleteT(Node *T)
{
if(T->lchild != NULL)
{
deleteT(T->lchild);
}//释放左子树
if(T->rchild != NULL)
{
deleteT(T->rchild);
}//释放右子树
free(T);//释放根结点
}
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
Node *T = NULL;//初始化根结点指针为空
for (int i = 0; i < n; i++)
{
int x;
scanf("%d",&x);
T = Insert(T,x);//插入数字
}
preOrder(T); //前序遍历输出
printf("\n");
inOrder(T);//中序遍历输出
printf("\n");
postOrder(T);//后序遍历输出
printf("\n");
deleteT(T);// 释放树结点
}
return 0;
} 后序就是倒着排列? 1.62行 else if (x > T->num);怎么这里是这样子
2.前中后序的右子树都是没有判断是否为空
目前发现这两处,有发现继续补充 close186 发表于 2017-2-12 21:41
后序就是倒着排列?
不是,你都不仔细看代码和问题
前序遍历:本身 左子树 右子树
中序遍历:左子树 本身 右子树
后序遍历:左子树 右子树 本身 补充回答:你的中序遍历和后序遍历中使用的都是先序遍历的函数 lumber2388779 发表于 2017-2-13 09:22
1.62行 else if (x > T->num);怎么这里是这样子
2.前中后序的右子树都是没有判断是否为空
目前发现这两处 ...
62行怎么了,我没明白。插入的数如果比根结点大就插入右子树啊,所以判断条件是x > T->num smgp 发表于 2017-2-14 15:24
62行怎么了,我没明白。插入的数如果比根结点大就插入右子树啊,所以判断条件是x > T->num
多了个分号 你的条件判定对了进入就结束了 lumber2388779 发表于 2017-2-14 15:45
多了个分号 你的条件判定对了进入就结束了
哦哦。对对。不知为何现在输出只剩一个数了,这个程序bug似乎贼多。我再看看。 smgp 发表于 2017-2-14 17:04
哦哦。对对。不知为何现在输出只剩一个数了,这个程序bug似乎贼多。我再看看。
最好增加点printf输出文字,这样方便定位问题出现在哪,或者善用调试模式 请问有人解决了这个问题了吗 还有这个程序错哪里了啊 菜鸟表示看不出来
页:
[1]