Morris遍历:常数空间遍历二叉树
Morris遍历
- cur有左树且第一次遍历到,去左孩子
- 没左树或者第二次遍历到,去右孩子
- 没右树,去后继节点
得到Morris序。对于该序列中出现两次的节点,只保留第一次遍历,结果就是先序遍历。只保留第二次遍历,结果就是中序。
对于后序遍历:第二次遍历到某个节点,则逆序打印这个节点的左子树的右边界,打印完所有的可以两次遍历的节点的左子树的右边界后逆序打印这棵树的右边界。不过逆序打印需要用到栈,但空间复杂度就变成log n了,O(1)的方法是反转链表(右孩子指针),遍历完再把链表调回来。