目 录:
其实之前的文章里已经记录了二叉树的递归/非递归遍历代码实现。但是由于 Morris 遍历可以实现最优的遍历方式,这无疑是在面试时遇到此问题非常加分的回答。
1、Morris 遍历的基本概念
Morris 遍历:时间复杂度 O(N)、额外空间复杂度 O(1),N 为二叉树的节点个数。
说明:和二叉树的遍历有关的最优解都是 Morris 遍历。
分析:
Morris 遍历:对于有左子树的节点 current,会遍历到两次,否则只会遍历到一次。对于有左子树的节点,它会先让左子树的最右节点 mostRight 指向它,从而达到之后能从底层节点返回上层。
- 如果 mostRight 的右指针为空,说明是第一次到达 current,然后会让它指向 current;
- 如果 mostRight 的右指针指向 current ,说明这是第二次到达 current,current 的左子树已经遍历完了,该回到 current,开始遍历其右子树了。
具体步骤:
1、如果 current 无左子树,current 向右移动【遍历其右子树】【无左子树,current 只会经过一次】;
2、如果 current 有左子树,找到 current 左子树上最右的节点 mostRight:
2.1、若 mostRight 的右指针指向 null【说明这