Skip to content

Latest commit

 

History

History
34 lines (20 loc) · 2.31 KB

File metadata and controls

34 lines (20 loc) · 2.31 KB

Morris算法

简介:

Morris算法可以用$\Omicron{(n)}$的时间复杂度和$\Omicron{(1)}$的空间复杂度,实现对二叉树的先序中序后序遍历。

算法详解:

先序遍历:

  • 如果当前节点(cur)的左子节点为空,【输出当前节点】,将当前节点右子节点设为当前节点(cur=cur.right);
  • 如果当前节点(cur)的左子节点不为空,找到当前节点左子树最右节点(pre)(即,当前节点中序遍历前驱节点);
    • 如果最右节点右子节点为空,【输出当前节点】,将当前节点设为该节点的右子节点
    • 如果最右节点右子节点不为空,将该节点的右子节点设为空,将当前节点右子节点设为当前节点

中序遍历:

  • 如果当前节点(cur)的左子节点为空,【输出当前节点】,将当前节点右子节点设为当前节点(cur=cur.right);
  • 如果当前节点(cur)的左子节点不为空,找到当前节点左子树最右节点(pre)(即,当前节点中序遍历前驱节点);
    • 如果最右节点右子节点为空,将当前节点设为该节点的右子节点
    • 如果最右节点右子节点不为空,将该节点的右子节点设为空,【输出当前节点】,将当前节点右子节点设为当前节点

后序遍历:

  • 如果当前节点(cur)的左子节点为空,将当前节点右子节点设为当前节点(cur=cur.right);
  • 如果当前节点(cur)的左子节点不为空,找到当前节点左子树最右节点(pre)(即,当前节点中序遍历前驱节点);
    • 如果最右节点右子节点为空,将当前节点设为该节点的右子节点
    • 如果最右节点右子节点不为空,将该节点的右子节点设为空,【倒序输出当前节点的左子节点(包括),到最右节点(包括)路径上所有节点】,将当前节点右子节点设为当前节点