LeetCode 145. Binary Tree Postorder Traversal
2020-05-17 11:04:29
# leetcode
Problem
LeetCode 145. Binary Tree Postorder Traversal
1. 题目简述
给出一颗二叉树,返回其后序遍历的顺序(List形式),且尽量使用非递归的形式。例如:
Input: [1,null,2,3]
1
\
2
/
3
Output: [3,2,1]
2. 算法思路
Stack:
递归的形式很好写,普通的后序遍历,这里不再赘述。问题在于非递归(迭代)的形式怎么办。
后序遍历应该是三种遍历中最难的一种了,为什么呢?问题在于我们很难界定什么时候去访问节点,什么时候去压栈。我们访问的顺序应该是“左->右->中”,也就是说我们压栈的顺序是“中->右->左”。
以上面为例,如果当前节点node为2节点,我们如何判断接下来是将3节点push下去还是访问2节点然后跳出呢?这里用一个lastNode变量来判断上次访问是否是当前节点的孩子节点。
遍历过程:
- 将根节点压栈;
- 如果栈不为空,则循环:pop栈顶元素给node,如果当前节点为叶子节点或者当前节点是lastNode的父节点,则访问该节点的值;如果都不满足,则说明当前节点的孩子还没被压栈,按照“中->右->左”的顺序压栈。
- 栈为空,循环终了
3. 解法
- 遍历时,注意lastNode的赋值
1 |
|