当前位置:   article > 正文

二叉树的中序非递归遍历c语言版_中序非递归遍历二叉树 c语言完整代码

中序非递归遍历二叉树 c语言完整代码

由于c语言没有c++的STL库,我们无法借助c++的stack库实现二叉树的非递归遍历,但是,我们完全可以自己打造一个c语言版的stack库。本篇博文就是借助我们之前在栈的链

式存储API http://blog.csdn.net/bbs375/article/details/52728358这篇博文实现的程序。当然,你也可以把它编译成动态库dll(可以参考如何封装自己的动态库应用案例http://blog.csdn.net/bbs375/article/details/52668322)放到自己的

工程项目中。


  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdlib.h>
  3. #include<stdio.h>
  4. #include <string.h>
  5. #include "linklist.h"
  6. #include "linkstack.h"
  7. //第一种表示方法 :二叉链表示法
  8. typedef struct BiTNode
  9. {
  10. int data;
  11. struct BiTNode *lchild,*rchild;
  12. } BiTNode,* BITree;
  13. //中序递归遍历
  14. void inOrder(BiTNode*root)
  15. {
  16. if (root==NULL)
  17. {
  18. return;
  19. }
  20. inOrder(root->lchild);
  21. printf("%d ",root->data);
  22. inOrder(root->rchild);
  23. }
  24. /*
  25. 中序遍历非递归算法:
  26. 步骤1:
  27. 如果结点有左子树,该结点入栈;
  28. 如果结点没有左子树,访问该结点;
  29. 步骤2:
  30. 如果结点有右子树,重复步骤1;
  31. 如果结点没有右子树(结点访问完毕),根据栈顶指示回退,访问栈顶元素,并访问右子树,重复步骤1
  32. 如果栈为空,表示遍历结束。*/
  33. //辅助函数 找到中序遍历的起点
  34. BiTNode* goLeft(BiTNode*t,LinkStack *s)
  35. {
  36. if (t==NULL)
  37. {
  38. return NULL;
  39. }
  40. //如果结点有左子树,该结点入栈;
  41. while (t->lchild)
  42. {
  43. LinkStack_Push(s,t);
  44. t = t->lchild;
  45. }
  46. return t;
  47. }
  48. //中序遍历非递归
  49. void inOrder2(BiTNode*root)
  50. {
  51. BiTNode* t ;
  52. LinkStack* s = LinkStack_Create();
  53. if (s==NULL)
  54. {
  55. return ;
  56. }
  57. //1.找到中序遍历的起点 (没有左孩子)
  58. t = goLeft(root,s);
  59. while (t)
  60. {
  61. //访问该元素
  62. printf("%d ",t->data);
  63. //2.如果t有右子树 重复步骤1
  64. if (t->rchild)
  65. {
  66. t = goLeft(t->rchild,s);//右子树中序遍历的起点
  67. }
  68. //2.如果没有右子树 根据栈顶指示回退
  69. else if (LinkStack_Size(s)>0)
  70. {
  71. t = LinkStack_Pop(s);
  72. }
  73. //3.如果没有右子树且栈为空 表示遍历结束
  74. else
  75. {
  76. t = NULL;
  77. }
  78. }
  79. }
  80. int main()
  81. {
  82. //创建节点
  83. BiTNode t1,t2,t3,t4,t5,t6;
  84. memset(&t1,0,sizeof(BiTNode));
  85. memset(&t2,0,sizeof(BiTNode));
  86. memset(&t3,0,sizeof(BiTNode));
  87. memset(&t4,0,sizeof(BiTNode));
  88. memset(&t5,0,sizeof(BiTNode));
  89. memset(&t6,0,sizeof(BiTNode));
  90. t1.data = 1;
  91. t2.data = 2;
  92. t3.data = 3;
  93. t4.data = 4;
  94. t5.data = 5;
  95. t6.data = 6;
  96. //建立关系
  97. t1.lchild = &t2;
  98. t1.rchild = &t3;
  99. t2.lchild = &t4;
  100. t2.rchild = &t5;
  101. t3.lchild = &t6;
  102. printf("\n中序递归遍历\n");
  103. inOrder(&t1);
  104. printf("\n中序非递归遍历\n");
  105. inOrder2(&t1);
  106. system("pause");
  107. return 0;
  108. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/589666
推荐阅读
相关标签
  

闽ICP备14008679号