二叉树的中序遍历
为什么把中序遍历放在最前面呢,因为在非递归遍历中,这个是最简单也是最容易理解的,所以放在第一个的位置。
中序遍历的递归算法很简单,但是想要非递归的实现,就要用到栈这个数据结构,
那么来看到中序遍历,先访问左节点,再访问根节点,最后访问右节点,
简单来讲就是一层一层地访问,同时保存节点,遇到空节点就往上回溯
左节点为空就返回根节点,右节点为空节返回根节点的根节点(因为当你访问到右节点的时候,你肯定已经访问完了根节点,所以要返回到根节点的根节点去继续迭代)
简单地画一个三层的二叉树自己推一遍基本就懂了
二叉树的非递归前序遍历
代码如下
其实就是从左到右,从上到下地遍历整棵树
有左节点就往左下走,并用栈存访问过的节点
走到头了就返回到栈中的上一个节点
在图示中的例子中,4是第一个左下的节点,栈中此时保存的数据的顺序是1,2,4
取出栈顶元素赋值给p,并让他往右走,就是stack.pop().right,4节点的右边没有节点了,也就是他不能往右走,这个时候继续回溯,此时栈中数据1,2 。取2节点然后往右走
往右走碰到了一棵子树,就是重复上述的过程,当整个根节点为5的子树遍历完了,此时栈中只剩下1这一个节点,然后1节点继续向右走,直到遍历结束
树的遍历无非就是大树嵌套小树,其实就是把递归的方法通过迭代来实现
以上代码的优化以及附加注释版如下:
前序
中序
非递归的后序遍历
首先依旧是从最左下开始遍历,并依次保存节点
在栈不为空的条件下,获取栈顶节点,如果符合条件就可以输出数据,将上一个访问的节点设置为当前节点,然后当前节点出栈
否则向右下移动
特别注意要将node=NULL
具体的过程可以参考代码的注释
接下来要更新到线索化二叉树