原文地址为: 二叉树后序遍历(非递归)


二叉树的递归遍历算法就不用说了;在非递归算法中,后序遍历难度大,很多书上只给出思想或者几段无法直接调试的代码,甚至有些书上是错的,当时我在研究的过程中,就是按着书上错误的代码绕了好半天,几预抓狂。好在最终摸索出来了,不禁感叹很多出书人的水平真是......   这里将直接可以在编译器里调试的代码贴出来(在DEV-C++编译器中编译通过)
 

这里我们约定:空的节点用空格表示,按照前序遍历来创建树!

1 // main.cpp

  2    #include  < iostream >
  3    using   namespace  std;
  4  typedef  struct  node {
  5           char  data;
  6           struct  node  * lchild;
  7           struct  node  * rchild;
  8          }BiNode, * BiTree;
  9  typedef  struct  node1{
 10          BiTree data[ 30 ];      // 默认30个元素 ,这里需要一个辅助堆栈!!!
 11           int  top;
 12          }Stack;
 13          
 14  void  createTree(BiTree  & T)    // 先序递归创建树,这里注意参数的类型,T的类型是 "*&" ,如果是 "**" 代码稍加改动就OK...
 15  {
 16        char  ch;
 17       cin. get (ch). get ();       //过滤输入流中每次回车产生的回车符
 18        if  (ch == '   ' ) T = NULL;     //这里首先判断是不是空格,如果是,则为该节点赋NULL
 19        else {
 20              T = (BiTree)malloc( sizeof (BiNode));
 21              T -> data = ch;
 22              createTree(T -> lchild);
 23              createTree(T -> rchild);
 24            }
 25  }
 26  void  initstack(Stack  *& st)
 27  {
 28       st = (Stack  * )malloc( sizeof (Stack));
 29       st -> top =- 1 ;
 30  }
 31  bool  isempty(Stack  * st)
 32  {
 33       return  st -> top ==- 1 ;
 34  }
 35  bool  isfull(Stack  * st)
 36  {
 37       return  st -> top == 19 ;
 38  }
 39  void  push(Stack  * st,BiTree T)
 40  {
 41        if  ( ! isfull(st))
 42        st -> data[ ++ st -> top] = T;     //栈顶指针始终指向堆栈最上面可用的一个元素,因此入栈时候,先要将指针加1,然后再执行入栈操作!
 43        else  cout << " 已满 " << endl;
 44  }
 45  BiTree pop(Stack  * st)
 46  {
 47        if  ( ! isempty(st))  return  st -> data[st -> top -- ];
 48  }
 49  BiTree gettop(Stack  * st)
 50  {
 51          if  ( ! isempty(st))  return  st -> data[st -> top];   //出栈时,先取出栈顶指针指向的元素,然后再将指针减1,使其指向栈中下一个可用元素!
 52  }
 53  void  preOrderNoRe(BiTree T)           // 前序遍历
 54  {
 55     Stack  * st;
 56     initstack(st);
 57     BiTree p;
 58     p = T;
 59        while  (p != NULL ||! isempty(st))
 60       {
 61              while  (p != NULL)
 62             {
 63                   cout << p -> data << "    " ;
 64                   push(st,p);
 65                   p = p -> lchild;
 66             }
 67              if  ( ! isempty(st))
 68             {
 69                         p = pop(st);
 70                         p = p -> rchild;
 71             }
 72             
 73       }
 74  }
 75  void  inOrderNoRe(BiTree T)       //中序遍历
 76  {
 77     Stack  * st;
 78     initstack(st);
 79     BiTree p;
 80     p = T;
 81        while  (p != NULL ||! isempty(st))
 82       {
 83              while  (p != NULL)
 84             {
 85                   push(st,p);
 86                   p = p -> lchild;
 87             }
 88              if  ( ! isempty(st))
 89             {
 90                         p = pop(st);
 91                         cout << p -> data << "    " ;
 92                         p = p -> rchild;
 93             }
 94             
 95       }
 96  }
 97  void  postOrderNoRe(BiTree T)          //后序遍历
 98  {
 99       BiTree p;
100       Stack  * st;
101       initstack(st);
102       p = T;
103        int  Tag[ 20 ];       // 栈,用于标识从左(0)或右(1)返回 
104        while  (p != NULL  ||   ! isempty(st))
105       {
106              while  (p != NULL)
107             {
108                   push(st,p);
109                   Tag[st -> top] = 0 ;
110                   p = p -> lchild;
111             }
112              while  ( ! isempty(st) && Tag[st -> top] == 1 )
113             {
114                   p = pop(st);
115                   cout << p -> data << "    " ;
116             }
117              if  ( ! isempty(st))
118             {
119                              Tag[st -> top] = 1 ;    // 设置标记右子树已经访问 
120                              p = gettop(st);
121                              p = p -> rchild;
122             }
123              else   break ;
124       }
125  }
126  int  main()
127  {
128      cout << " Enter char one by one                      hicjiajia " << endl;
129      BiNode  * T;
130      createTree(T);
131      cout << endl;
132      
133      cout << " preOrderNoRe:   " ;preOrderNoRe(T);cout << endl;
134      cout << " inOrderNoRe:    " ;inOrderNoRe(T);cout << endl;
135      cout << " postOrderNoRe:  " ;postOrderNoRe(T);cout << endl; 
136      system( " pause " );
137       return   0 ;
138  }

运行结果如图:

转载请注明本文地址: 二叉树后序遍历(非递归)

二叉树后序遍历(非递归)相关推荐

  1. 二叉树后序遍历_二叉树后序遍历非递归实现

    二叉树的后序遍历非递归实现是三种遍历实现里面最复杂的一种了. 后序遍历的顺序是左节点-右节点-根节点,因为二叉树每个节点只有指向子节点的指针而没有指向父节点的指针,因此我们需要一个额外的变量来记录是否 ...

  2. Java 二叉树后序遍历(递归/非递归)

    Java 二叉树后序遍历(递归/非递归) 简介: 遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次. 设L.D.R分 ...

  3. 后序遍历的非递归算法python_二叉树后序遍历(递归与非递归)算法C语言实现...

    二叉树后序遍历的实现思想是:从根节点出发,依次遍历各节点的左右子树,直到当前节点左右子树遍历完成后,才访问该节点元素. 图 1 二叉树 如图 1 中,对此二叉树进行后序遍历的操作过程为: 从根节点 1 ...

  4. 二叉树前序、中序、后序遍历非递归写法的透彻解析

    前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历.递归写法,只要理解思想,几行代码.可是非递归写法却很不容易.这里特地总结下,透彻解析它们的非递归写法.其中,中序遍历的非递归写法最简 ...

  5. 数据结构 5-3-2 二叉树前序中序后序遍历非递归实现

    一.前言 上一篇整理了几种遍历方式的递归实现,递归的实现方法都很简单,区区几句代码就可以实现,但是如果要用非递归的方法来实现就有些挑战了. 二.中序遍历 从中序遍历开始,其实非递归的方法就是把递归变成 ...

  6. 二叉树的前序、中序、后序遍历非递归实现

    这是leetcode上的3个题目,要求用非递归实现,其中以后序遍历实现最难,既然递归实现的三种遍历程序只需要改变输入代码顺序,为什么循环不可以呢,带着这种执拗的想法,我开始了这次研究 我依然是将递归用 ...

  7. 2021 - 10 -7 ! 二叉树的前序、中序、后序遍历 非递归思路(迭代版本)

    //! 前序遍历的非递归版本,精髓在于用栈模拟递归的过程,但实际进栈出栈顺序与递归并不一样, //! 比较抽象,建议画图理解,比较重要 void BinarySearchTreesZH::preord ...

  8. Java二叉树后序遍历:递归与迭代

    二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树:左子树和右子树又同样都是二叉树. 如下便是一棵二叉树: 二叉树的后序遍历方式为: 1. 如果根节点有左 ...

  9. 数据结构二叉树后序遍历非递归算法

    后序遍历的非递归代码 void PostOrder(BiTree T) { // Add your code hereif(T==NULL) return; //如果为空,则退出Stack s;Ini ...

最新文章

  1. linux环境下 PYTHONPATH添加
  2. 【运筹学】线性规划数学模型 ( 单纯形法 | 第二次迭代 | 方程组同解变换 | 生成新单纯形表 | 计算检验数 | 最优解判定 | 线性规划解个数分析 )
  3. 进程池的同步方法 pool.apply
  4. python概念英文版_和我一起学python,基本概念 (life is short ,we need python)
  5. php7 myrypt,nginx + php 配置
  6. JUnit 5 –架构
  7. OpenStack —— DevStack一键自动化安装
  8. PhpStorm 的基本应用
  9. Android service 和 client的进程通信和消息回调--AIDL
  10. 基于SpringBoot的在线音乐播放系统
  11. 计算机考试题目czt,8级计算机组成原理本科期末试题a带答案(史岚).docx
  12. magento Service Temporarily Unavailable
  13. RTP包里面得到H.264数据和AAC数据的方法
  14. 实现一个HTTP服务器的Demo
  15. 在计算机桌面中选择了隐藏如何显示不出来的,电脑桌面文件被隐藏了怎么办
  16. dell电脑如何安装ubuntu系统_如何在 Dell PC 上安装 Ubuntu Linux
  17. 简易聊天软件开发(python+socket)
  18. 给学校开放计算机建议书30字,学生给学校建议书
  19. win10创建新的计算机用户名和密码,Win10怎么新建账户 Win10创建新用户图文教程...
  20. 潇洒老师分享的小知识:注塑模具“压模”的原因和预防措施

热门文章

  1. 背水一战 Windows 10 (5) - UI: 标题栏
  2. SpringMVC-配置JSP视图解析器
  3. CCF CSP认证考试题解目录
  4. Word出现很多灰色小点点和箭头的解决方法:
  5. 做程序员自己要学会爱惜自己的身体
  6. 快速排序及其C++代码实现
  7. 基于ROS搭建简易软件框架实现ROV水下目标跟踪(四)--网络配置
  8. 正态分布及matlab实现
  9. 提示文件过大无法复制到U盘怎么解决
  10. 有一种只能相爱却不能相守的情(ZZ)