左神基础班04

题目一 实现二叉树的先序、 中序、 后序遍历, 包括递归方式和非递归方式

1 递归思路

假设有一棵二叉树如左所示,将二叉树进行遍历,忽略打印行为,递归函数依次访问节点的顺序如右所示。打印时机放在第一次来到这个节点的时候就是先序遍历,第二次就是中序遍历,第三次就是后序遍历。(代码都很像)

左神基础班04

2 非递归思路(压栈)

先序遍历: 把头结点压进去,如果栈不为空的话把栈顶弹出来,然后如果这个节点右孩子不为空,压右孩子,左孩子不为空压左孩子,只要有往里压,先右后左

中序遍历: 如果栈不为空或者头节点不为空,只要是当前节点就把左边界都压到栈里,来到空时,从栈中弹出一个节点,head向右移动。当前节点为空,从栈拿一个打印 ,当前节点往右跑;当前节点不为空,当前节点压入栈,当前节点往左。

后序遍历(两个栈): 中序遍历是先中再左再右,可以换一下左右节点压栈的顺序,变成先中再右再左,后序遍历是先左再右再中,就是上一种顺序的逆序,实现该逆序可以再建一个栈,上一种方式该打印的时候不打印,都压到栈里,最后再打印第二个辅助栈的节点。妙啊!!!!

后续遍历(一个栈): 书里