Skip to content

Latest commit

 

History

History

144. Binary Tree Postorder Traversal

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

早就在想,后序遍历啥时候来,这下总算姗姗来迟。

后序遍历是三序遍历中最墨迹的一个,因为它是伟大的父母,先让儿子(左子树)走,再让女儿(右子树)走,最后才是自己走。子树当了父母,又是这样做。

这就导致它的迭代有点啰嗦,你想象一下,一个老爹爹,不住的问,儿子走了吗?孙子呢?女儿走了吗?外孙女呢?...几乎要把整个家族数个遍。

所以我的算法思路仍然和之前的 先序、中序差不多,都是弄个堆栈,如果根存在,那么将根入栈,走左子树;问题的关键在于:左子树走到头,回溯的时候,还要顾及右子树,也就是根不能忙着出栈,那问题来了,啥时候出?

答曰:右子树走完的时候。 问题又来了,右子树啥时候走完?我们知道,移到右子树的时候,流程就又回到了最开头。这时候咱们的栈,已经无法起到提醒我们哪些没走的作用,我们缺了个东西。

这个东西我能想到最简单的实现就是一个标记指针。它指向“裸根”,也就是左子树、右子树都走完的根。

  • 如果右子树存在,且右子树不是“裸根”(裸根意味着已经走过了),那么才开始迭代右子树。
  • 否则,标记“裸根”,记录根值,出栈。与先序、中序的步骤一致。

想到这一点,代码就呼之欲出了。