Morris算法可以用$\Omicron{(n)}$的时间复杂度和$\Omicron{(1)}$的空间复杂度,实现对二叉树的先序、中序、后序遍历。
- 如果当前节点(cur)的左子节点为空,【输出当前节点】,将当前节点的右子节点设为当前节点(cur=cur.right);
- 如果当前节点(cur)的左子节点不为空,找到当前节点的左子树的最右节点(pre)(即,当前节点的中序遍历的前驱节点);
- 如果最右节点的右子节点为空,【输出当前节点】,将当前节点设为该节点的右子节点;
- 如果最右节点的右子节点不为空,将该节点的右子节点设为空,将当前节点的右子节点设为当前节点;
- 如果当前节点(cur)的左子节点为空,【输出当前节点】,将当前节点的右子节点设为当前节点(cur=cur.right);
- 如果当前节点(cur)的左子节点不为空,找到当前节点的左子树的最右节点(pre)(即,当前节点的中序遍历的前驱节点);
- 如果最右节点的右子节点为空,将当前节点设为该节点的右子节点;
- 如果最右节点的右子节点不为空,将该节点的右子节点设为空,【输出当前节点】,将当前节点的右子节点设为当前节点;
- 如果当前节点(cur)的左子节点为空,将当前节点的右子节点设为当前节点(cur=cur.right);
- 如果当前节点(cur)的左子节点不为空,找到当前节点的左子树的最右节点(pre)(即,当前节点的中序遍历的前驱节点);
- 如果最右节点的右子节点为空,将当前节点设为该节点的右子节点;
- 如果最右节点的右子节点不为空,将该节点的右子节点设为空,【倒序输出当前节点的左子节点(包括),到最右节点(包括)路径上所有节点】,将当前节点的右子节点设为当前节点;