中序遍历基本思路:左子树->根节点->右子树
莫里斯遍历思路:不使用任何辅助空间,强行把一棵二叉树改成一段链表结构。
参阅文章:python3-迭代遍历(常规解法&模板解法),Morris遍历
既然是链表,则每个结点cur,都要有前驱结点prev和后继结点post。
- 对于有右子树的结点cur,按照中序遍历的规则,他的后继结点post就是cur右子树上最左侧的结点
- 对于没有右子树的结点cur,按照中序遍历的规则,他的后继结点post就是其自下而上的父节点中第一个将其作为左子树的节点。
情况2有点难理解,我们可以换种理解方式:
- 对于有左子树的结点cur,按照中序遍历的规则,他的前驱结点prev就是cur左子树上最右侧的结点
因此结合1和3,就能得到莫里斯中序遍历的基本步骤:(中序遍历:左——中——右)
首先遍历左子树:步骤(1)(2),自己可以随便画一棵二叉树示意
- (1)当前结点没有左孩子,则访问当前结点cur,迭代遍历cur的右子树(cur=cur.right)