Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

README.md

Morris算法

简介:

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

算法详解:

先序遍历:

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

中序遍历:

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

后序遍历:

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