鱼C论坛

 找回密码
 立即注册
查看: 3513|回复: 15

小白对二叉树非递归中序遍历的若干问题

[复制链接]
发表于 2018-5-20 00:18:53 | 显示全部楼层 |阅读模式

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

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

x
最近在学习二叉树非递归中序遍历,盗来的代码如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define A 100      //栈的空间初始分配大小

  4. typedef struct BiNode{   //定义二叉链表
  5.         char data;
  6.         struct BiNode *lchild,*rchild;
  7. }BiNode,*BiTree;                           //BiNode->struct BiNode      BiTree-> struct BiNode *    -> BiTree * 双重指针

  8. typedef struct{ //定义栈
  9.         BiTree *base;
  10.         BiTree *top;
  11.         int stacksize;//分配的存储空间的大小
  12. }Sqstack;                   //Sqstack->struct

  13. void initstack(Sqstack *S)  //初始化栈
  14. {
  15.         S->base=(BiTree* )malloc(sizeof(A))        ;
  16.         S->top=S->base;
  17.         S->stacksize=A;
  18. }

  19. int emptystack(Sqstack* S) //判断栈是否为空,若为空则返回1
  20. {
  21.         if(S->base!=S->top)
  22.         {
  23.                 return 0;
  24.         }
  25.         else
  26.         {
  27.                 return 1;
  28.         }
  29. }


  30. void push(Sqstack *S,BiTree e)  //将元素进栈  这里e不用指针->因为不用返回e,而是输入e
  31. {
  32.         if(S->top-S->base==S->stacksize)
  33.         {
  34.                 printf("此时栈满,不能插入啦。\n");
  35.         }
  36.         else
  37.         {
  38.                 *(S->top)=e;
  39.                 (S->top)++;
  40.         }
  41. }


  42. void pop(Sqstack *S,BiTree *e)  //将元素出栈    这里e要用指针->因为出栈有返回栈顶
  43. {
  44.         if(S->base==S->top)
  45.         {
  46.                 printf("为空,不能弹出\n");
  47.         }
  48.         else
  49.         {
  50.                 S->top--;
  51.                 *e=*(S->top);
  52.         }
  53. }

  54. void initBitree(BiTree *T)   //初始化树,即建造一棵空树   * 用来返回值
  55. {
  56.         *T=NULL;
  57.         printf("空树构造成功。\n");
  58. }


  59. void CreatBitree(BiTree* T) //先序建立一个二叉树   *用来返回值   *T仍然是一个指针->因为BiTree本身是一个指针类型
  60. {
  61.         char c;
  62.         scanf("%c",&c);
  63.         if(c=='*')
  64.         {
  65.                 *T=NULL;
  66.         }
  67.         else
  68.         {
  69.                 *T=(BiTree)malloc(sizeof(BiNode));
  70.                 (*T)->data=c;//生成的根节点里输入数据
  71.                 CreatBitree(&(*T)->lchild);  //递归创建左子树
  72.                 CreatBitree(&(*T)->rchild);  //递归创建右子树
  73.         }
  74. }

  75. void inorderbitree(BiTree T)  //中序遍历,非递归    没有改变树的结构 没必要用指针
  76. {
  77.         BiTree p=T;
  78.         Sqstack S;
  79.         initstack(&S);//初始化栈,构造结点
  80.         while(p||!emptystack(&S))
  81.         {
  82.                 if(p)         //一直遍历到左子树的最下边 便遍历边入栈
  83.                 {
  84.                         push(&S,p);
  85.                         p=p->lchild;
  86.                 }
  87.                 else         //当p为空时,说明已经到达左子树最下边,此时需要出栈,并打印该结点
  88.                 {
  89.                         pop(&S,&p);
  90.                         printf("%c",p->data);
  91.                         p=p->rchild;  //进入右子树
  92.                 }
  93.         }
  94. }




  95. int main()
  96. {
  97.         BiTree T;
  98.         printf("先序创建一个二叉树:\n");
  99.         CreatBitree(&T);
  100.         printf("该二叉树的中序遍历结果为:");
  101.         inorderbitree(T);
  102.         printf("\n");
  103.         return 0;
  104. }

复制代码



上面是一个可执行的代码,我自己加了点注释,不知对否。接下来我的问题如下:

①inorderbitree函数为什么不能改为如下代码:

  1. void inorderbitree(BiTree T)  //中序遍历,非递归    没有改变树的结构 没必要用指针
  2. {
  3.         BiTree p=T;
  4.         Sqstack *S=NULL;
  5.         initstack(S);//初始化栈,构造结点
  6.         while(p||!emptystack(S))
  7.         {
  8.                 if(p)         //一直遍历到左子树的最下边 便遍历边入栈
  9.                 {
  10.                         push(S,p);
  11.                         p=p->lchild;
  12.                 }
  13.                 else         //当p为空时,说明已经到达左子树最下边,此时需要出栈,并打印该结点
  14.                 {
  15.                         pop(S,&p);
  16.                         printf("%c",p->data);
  17.                         p=p->rchild;  //进入右子树
  18.                 }
  19.         }
  20. }
复制代码


即把S定义为Sqstack类型的指针,这样的话在调用函数的时候可以直接写S而不是&S。但是不能成功运行,为何?


②CreatBitree函数中的scanf是如何做到直接输入一行字符便可执行,而不是需要输入一个字符按一次回车?(是不是和递归有关?本人对递归不是很了解。。)


本人小白,最近因为比较忙对学习一直朝三暮四,但会尽快恢复状态。如果我的问题有蠢到各位或者有哪些知识点没有学好的地方,恳请各位指正!
在这里先谢谢各位dalao!如有更好的学习建议请各位指出!

PS:严蔚敏的数据结构太晦涩难懂了。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-20 02:11:17 | 显示全部楼层
1.png
2.png
GIF.gif

PS:严蔚敏的数据结构的确太晦涩难懂了,不适合自学,推荐一个适合自学的《大话数据结构》
^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-20 08:11:26 From FishC Mobile | 显示全部楼层
人造人 发表于 2018-5-20 02:11
PS:严蔚敏的数据结构的确太晦涩难懂了,不适合自学,推荐一个适合自学的《大话数据结构》
^_^

谢谢dalao,那我那个想法有错吗,如果没错的话该怎么用指针定义S呢。我是看到他报错说没有初始化,我才把他NULL。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-20 13:03:58 | 显示全部楼层

回帖奖励 +1 鱼币

仓鼠爱跑圈 发表于 2018-5-20 08:11
谢谢dalao,那我那个想法有错吗,如果没错的话该怎么用指针定义S呢。我是看到他报错说没有初始化,我才把 ...

没有仔细看你的程序,这样应该可以,至少调试没有报错

360截图1872012767120110.png

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define A 100                        // 栈的空间初始分配大小

  4. // 定义二叉链表
  5. typedef struct BiNode
  6. {
  7.         char data;
  8.         struct BiNode *lchild, *rchild;
  9. }BiNode, *BiTree;

  10. // 定义栈
  11. typedef struct
  12. {
  13.         BiTree *base;
  14.         BiTree *top;
  15.         int stacksize;                // 分配的存储空间的大小
  16. }Sqstack;

  17. int emptystack(Sqstack* S)        // 判断栈是否为空,若为空则返回1
  18. {
  19.         if(S->base != S->top)
  20.         {
  21.                 return 0;
  22.         }
  23.         else
  24.         {
  25.                 return 1;
  26.         }
  27. }

  28. void push(Sqstack *S, BiTree e)                // 将元素进栈  这里e不用指针->因为不用返回e,而是输入e
  29. {
  30.         if(S->top - S->base == S->stacksize)
  31.         {
  32.                 printf("此时栈满,不能插入啦。\n");
  33.         }
  34.         else
  35.         {
  36.                 *(S->top) = e;
  37.                 (S->top)++;
  38.         }
  39. }

  40. void pop(Sqstack *S, BiTree *e)                // 将元素出栈    这里e要用指针->因为出栈有返回栈顶
  41. {
  42.         if(S->base == S->top)
  43.         {
  44.                 printf("为空,不能弹出\n");
  45.         }
  46.         else
  47.         {
  48.                 S->top--;
  49.                 *e = *(S->top);
  50.         }
  51. }

  52. void initBitree(BiTree *T)                // 初始化树,即建造一棵空树   * 用来返回值
  53. {
  54.         *T = NULL;
  55.         printf("空树构造成功。\n");
  56. }

  57. void CreatBitree(BiTree* T)                // 先序建立一个二叉树   *用来返回值   *T仍然是一个指针->因为BiTree本身是一个指针类型
  58. {
  59.         char c;
  60.         scanf("%c", &c);
  61.         if(c == '*')
  62.         {
  63.                 *T = NULL;
  64.         }
  65.         else
  66.         {
  67.                 *T = (BiTree)malloc(sizeof(BiNode));
  68.                 (*T)->data = c;                                // 生成的根节点里输入数据
  69.                 CreatBitree(&(*T)->lchild);                // 递归创建左子树
  70.                 CreatBitree(&(*T)->rchild);                // 递归创建右子树
  71.         }
  72. }

  73. void initstack(Sqstack *S);
  74. void inorderbitree(BiTree T)                // 中序遍历,非递归    没有改变树的结构 没必要用指针
  75. {
  76.         BiTree p = T;
  77.         Sqstack S;
  78.         initstack(&S);                        // 初始化栈,构造结点
  79.         while(p || !emptystack(&S))
  80.         {
  81.                 if(p)                        // 一直遍历到左子树的最下边 便遍历边入栈
  82.                 {
  83.                         push(&S, p);
  84.                         p = p->lchild;
  85.                 }
  86.                 else                        // 当p为空时,说明已经到达左子树最下边,此时需要出栈,并打印该结点
  87.                 {
  88.                         pop(&S, &p);
  89.                         printf("%c", p->data);
  90.                         p = p->rchild;        // 进入右子树
  91.                 }
  92.         }
  93. }

  94. void initstack(Sqstack *S)        // 初始化栈
  95. {
  96.         S->base = (BiTree*)malloc(sizeof(A));
  97.         S->top = S->base;
  98.         S->stacksize = A;
  99. }

  100. void initstack_ptr1(Sqstack **S)        // 初始化栈
  101. {
  102.         (*S) = malloc(sizeof(Sqstack));

  103.         (*S)->base = (BiTree*)malloc(sizeof(A));
  104.         (*S)->top = (*S)->base;
  105.         (*S)->stacksize = A;
  106. }

  107. Sqstack *initstack_ptr2(void)        // 初始化栈
  108. {
  109.         Sqstack *s = malloc(sizeof(Sqstack));

  110.         s->base = (BiTree*)malloc(sizeof(A));
  111.         s->top = s->base;
  112.         s->stacksize = A;
  113.         return s;
  114. }
  115. int main(void)
  116. {
  117.         Sqstack S;
  118.         initstack(&S);

  119.         Sqstack *S1;
  120.         initstack_ptr1(&S1);
  121.        
  122.         Sqstack *S2 = initstack_ptr2();
  123.        
  124.         /*Sqstack *S1 = NULL;
  125.         initstack(S1);*/

  126.        
  127.         return 0;
  128. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-21 23:57:21 | 显示全部楼层

回帖奖励 +1 鱼币

路过看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-25 19:26:02 | 显示全部楼层

回帖奖励 +1 鱼币

很详细,不错哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-10 16:04:30 | 显示全部楼层

回帖奖励 +1 鱼币

学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-10 16:16:22 | 显示全部楼层

回帖奖励 +1 鱼币

学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-14 08:46:47 | 显示全部楼层

回帖奖励 +1 鱼币

支持楼主!楼主加油!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-16 17:33:09 | 显示全部楼层

回帖奖励 +1 鱼币

666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-26 15:33:13 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-26 15:34:20 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-7 16:22:12 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-9 21:42:38 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-28 23:00:45 | 显示全部楼层

回帖奖励 +1 鱼币

学习一下··
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-30 11:54:37 | 显示全部楼层

回帖奖励 +1 鱼币

占楼..
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 00:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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