一、需求
- 给定一个二叉树,返回它的 后序 遍历。
示例:
输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
二、递归法
2.1 思路分析
- 按照左、右、根的思路递归子树即可;
2.2 代码实现
class Solution {
List<Integer> res = new ArrayList<>();
public List<Integer> postorderTraversal(TreeNode root) {
postorder(root);
return res;
}
private void postorder(TreeNode root) {
if(root == null) {
return;
}
postorder(root.left);
postorder(root.right);
res.add(root.val);
}
}
2.3 复杂度分析
- 时间复杂度为O(N);
- 空间复杂度为O(N);
三、迭代法
3.1 思路分析
- 后序遍历过程中,先将根节点入栈,然后是它的右子树,然后是它的左子树,将栈中的元素全部出栈就是后序遍历序列,它是前序遍历的镜像;
3.2 代码实现
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
LinkedList<Integer> res = new LinkedList<>();
Deque<TreeNode> stack = new ArrayDeque<>();
TreeNode node = root;
//条件为什么这么写,可以参考前序遍历那一篇
while(node != null || !stack.isEmpty()) {
while(node != null) {
res.addFirst(node.val);
stack.push(node);
node = node.right;
}
node = stack.pop();
node = node.left;
}
return res;
}
}
3.3 复杂度分析
- 时间复杂度为O(N);
- 空间复杂度为O(N);
四、学习地址
作者:LeetCode-Solution