Given a binary tree, return the postorder traversal of its nodes’ values.
Example:
Input: [1,null,2,3]1\2/3Output: [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;}}
