鱼C论坛

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

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

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

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

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

x
输入数据建立一个二叉排序树,按照前序、中序后序输出,
这是我写的代码,我看了好久不知道错哪了。但是运行结果仿佛贼错。
输入的数据根据顺序输出的数据个数都不一定

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. struct Node
  4. {
  5.         Node *lchild;
  6.         Node *rchild;
  7.         int num;
  8. };//定义结点类型便于创建树

  9. void preOrder(Node *T)
  10. {
  11.         printf("%d ",T->num);
  12.         if (T->lchild != NULL)
  13.         {
  14.                 preOrder(T->lchild);
  15.         }
  16.         if (T->rchild)
  17.         {
  18.                 preOrder(T->rchild);
  19.         }
  20. }//前序遍历
  21. void inOrder(Node *T)
  22. {
  23.         if (T->lchild != NULL)
  24.         {
  25.                 preOrder(T->lchild);
  26.         }
  27.         printf("%d ",T->num);
  28.         if (T->rchild)
  29.         {
  30.                 preOrder(T->rchild);
  31.         }
  32. }//中序遍历
  33. void postOrder(Node *T)
  34. {
  35.         if (T->lchild != NULL)
  36.         {
  37.                 preOrder(T->lchild);
  38.         }
  39.         if (T->rchild)
  40.         {
  41.                 preOrder(T->rchild);
  42.         }
  43.         printf("%d ",T->num);
  44. }//后序遍历

  45. Node *Insert(Node *T,int x)
  46. {//插入数字x
  47.         if (T == NULL)
  48.         {//树为空
  49.                 T = (Node*)malloc(sizeof(Node));//申请一个结点空间作为根节点
  50.                 T->lchild = NULL;
  51.                 T->rchild = NULL;
  52.                 T->num = x;
  53.                 return T;
  54.         }
  55.         else if (x < T->num)
  56.         {//插入T的左子树
  57.                 T->lchild = Insert(T->lchild,x);
  58.         }
  59.         else if (x > T->num);
  60.         {//插入T的右子树
  61.                 T->rchild = Insert(T->rchild,x);
  62.         }
  63.         return T;//返回根节点指针
  64. }
  65. void deleteT(Node *T)
  66. {
  67.         if(T->lchild != NULL)
  68.         {
  69.                 deleteT(T->lchild);
  70.         }//释放左子树
  71.         if(T->rchild != NULL)
  72.         {
  73.                 deleteT(T->rchild);
  74.         }//释放右子树
  75.         free(T);//释放根结点
  76. }
  77. int main()
  78. {
  79.         int n;
  80.         while(scanf("%d",&n) != EOF)
  81.         {
  82.                 Node *T = NULL;//初始化根结点指针为空
  83.                 for (int i = 0; i < n; i++)
  84.                 {
  85.                         int x;
  86.                         scanf("%d",&x);
  87.                         T = Insert(T,x);//插入数字
  88.                 }
  89.                 preOrder(T); //前序遍历输出
  90.                 printf("\n");
  91.                 inOrder(T);//中序遍历输出
  92.                 printf("\n");
  93.                 postOrder(T);//后序遍历输出
  94.                 printf("\n");
  95.                 deleteT(T);// 释放树结点
  96.         }
  97.         return 0;
  98. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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-4-25 09:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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