Binary Tree Postorder Traversal (H)
Given a binary tree, return the postorder traversal of its nodes’ values.
Example:
Input: [1,null,2,3]
1
\
2
/
3
Output: [3,2,1]
Follow up: Recursive solution is trivial, could you do it iteratively?
题意
求树的后序遍历。
思路
递归或迭代。
后序遍历的迭代方法和前序、中序的区别在于当前结点必须在左右子树全访问完后才能访问,这就导致了在利用栈进行回溯时不能随意出栈(只有结点被访问后才能出栈,而在回溯时当前结点还没有被访问),因此需要借助一个辅助栈来进行回溯,用另一个栈来记录后序遍历的所有结点。
代码实现 - 递归
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
postOrder(root, ans);
return ans;
}
private void postOrder(TreeNode x, List<Integer> ans) {
if (x == null) {
return;
}
postOrder(x.left, ans);
postOrder(x.right, ans);
ans.add(x.val);
}
}
代码实现 - 迭代
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
Deque<TreeNode> temp = new ArrayDeque<>(); // 辅助栈,用来处理回溯
Deque<TreeNode> stack = new ArrayDeque<>(); // 记录后序遍历的顺序
TreeNode cur = root;
while (cur != null || !temp.isEmpty()) {
if (cur != null) {
temp.push(cur);
stack.push(cur);
cur = cur.right;
} else {
cur = temp.pop().left;
}
}
while (!stack.isEmpty()) {
ans.add(stack.pop().val);
}
return ans;
}
}
本文详细介绍了二叉树的后序遍历算法,包括递归和迭代两种实现方式。通过实例解析,展示了如何使用栈来辅助完成迭代遍历过程。
314

被折叠的 条评论
为什么被折叠?



