鱼C论坛

 找回密码
 立即注册
查看: 3839|回复: 9

二叉排序树的建立与前序 中序 后序输出

[复制链接]
发表于 2017-2-12 19:01:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
输入数据建立一个二叉排序树,按照前序、中序后序输出,
这是我写的代码,我看了好久不知道错哪了。但是运行结果仿佛贼错。
输入的数据根据顺序输出的数据个数都不一定
#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; 
} 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-12 21:41:07 | 显示全部楼层
后序就是倒着排列?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-13 09:22:19 | 显示全部楼层
1.62行 else if (x > T->num);怎么这里是这样子
2.前中后序的右子树都是没有判断是否为空
目前发现这两处,有发现继续补充
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-13 09:24:38 | 显示全部楼层
close186 发表于 2017-2-12 21:41
后序就是倒着排列?

不是,你都不仔细看代码和问题
前序遍历:本身 左子树 右子树
中序遍历:左子树 本身 右子树
后序遍历:左子树 右子树 本身
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-13 09:49:27 | 显示全部楼层
补充回答:你的中序遍历和后序遍历中使用的都是先序遍历的函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-14 15:24:26 | 显示全部楼层
lumber2388779 发表于 2017-2-13 09:22
1.62行 else if (x > T->num);怎么这里是这样子
2.前中后序的右子树都是没有判断是否为空
目前发现这两处 ...

62行怎么了,我没明白。插入的数如果比根结点大就插入右子树啊,所以判断条件是x > T->num
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-14 15:45:48 | 显示全部楼层
smgp 发表于 2017-2-14 15:24
62行怎么了,我没明白。插入的数如果比根结点大就插入右子树啊,所以判断条件是x > T->num

多了个分号 你的条件判定对了进入就结束了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-14 17:04:22 | 显示全部楼层
lumber2388779 发表于 2017-2-14 15:45
多了个分号 你的条件判定对了进入就结束了

哦哦。对对。不知为何现在输出只剩一个数了,这个程序bug似乎贼多。我再看看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-14 17:41:08 | 显示全部楼层
smgp 发表于 2017-2-14 17:04
哦哦。对对。不知为何现在输出只剩一个数了,这个程序bug似乎贼多。我再看看。

最好增加点printf输出文字,这样方便定位问题出现在哪,或者善用调试模式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-12 13:19:43 | 显示全部楼层
请问有人解决了这个问题了吗 还有这个程序错哪里了啊 菜鸟表示看不出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-29 09:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表