二叉树非递归中序遍历

  • Post author:
  • Post category:其他


二叉树的中序遍历

为什么把中序遍历放在最前面呢,因为在非递归遍历中,这个是最简单也是最容易理解的,所以放在第一个的位置。

中序遍历的递归算法很简单,但是想要非递归的实现,就要用到栈这个数据结构,

那么来看到中序遍历,先访问左节点,再访问根节点,最后访问右节点,

简单来讲就是一层一层地访问,同时保存节点,遇到空节点就往上回溯

左节点为空就返回根节点,右节点为空节返回根节点的根节点(因为当你访问到右节点的时候,你肯定已经访问完了根节点,所以要返回到根节点的根节点去继续迭代)

简单地画一个三层的二叉树自己推一遍基本就懂了

二叉树的非递归前序遍历

代码如下

其实就是从左到右,从上到下地遍历整棵树

有左节点就往左下走,并用栈存访问过的节点

走到头了就返回到栈中的上一个节点

在图示中的例子中,4是第一个左下的节点,栈中此时保存的数据的顺序是1,2,4

取出栈顶元素赋值给p,并让他往右走,就是stack.pop().right,4节点的右边没有节点了,也就是他不能往右走,这个时候继续回溯,此时栈中数据1,2 。取2节点然后往右走

往右走碰到了一棵子树,就是重复上述的过程,当整个根节点为5的子树遍历完了,此时栈中只剩下1这一个节点,然后1节点继续向右走,直到遍历结束

树的遍历无非就是大树嵌套小树,其实就是把递归的方法通过迭代来实现

以上代码的优化以及附加注释版如下:

前序

中序

非递归的后序遍历

首先依旧是从最左下开始遍历,并依次保存节点

在栈不为空的条件下,获取栈顶节点,如果符合条件就可以输出数据,将上一个访问的节点设置为当前节点,然后当前节点出栈

否则向右下移动

特别注意要将node=NULL

具体的过程可以参考代码的注释

接下来要更新到线索化二叉树



版权声明:本文为weixin_55504695原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。