Given a binary tree, return the postorder traversal of its nodes’ values.

    Example:

    1. Input: [1,null,2,3]
    2. 1
    3. \
    4. 2
    5. /
    6. 3
    7. Output: [3,2,1]

    Follow up: Recursive solution is trivial, could you do it iteratively?


    题意

    求树的后序遍历。

    思路

    递归或迭代。

    后序遍历的迭代方法和前序、中序的区别在于当前结点必须在左右子树全访问完后才能访问,这就导致了在利用栈进行回溯时不能随意出栈(只有结点被访问后才能出栈,而在回溯时当前结点还没有被访问),因此需要借助一个辅助栈来进行回溯,用另一个栈来记录后序遍历的所有结点。


    代码实现 - 递归

    1. /**
    2. * Definition for a binary tree node.
    3. * public class TreeNode {
    4. * int val;
    5. * TreeNode left;
    6. * TreeNode right;
    7. * TreeNode(int x) { val = x; }
    8. * }
    9. */
    10. class Solution {
    11. public List<Integer> postorderTraversal(TreeNode root) {
    12. List<Integer> ans = new ArrayList<>();
    13. postOrder(root, ans);
    14. return ans;
    15. }
    16. private void postOrder(TreeNode x, List<Integer> ans) {
    17. if (x == null) {
    18. return;
    19. }
    20. postOrder(x.left, ans);
    21. postOrder(x.right, ans);
    22. ans.add(x.val);
    23. }
    24. }

    代码实现 - 迭代

    1. /**
    2. * Definition for a binary tree node.
    3. * public class TreeNode {
    4. * int val;
    5. * TreeNode left;
    6. * TreeNode right;
    7. * TreeNode(int x) { val = x; }
    8. * }
    9. */
    10. class Solution {
    11. public List<Integer> postorderTraversal(TreeNode root) {
    12. List<Integer> ans = new ArrayList<>();
    13. Deque<TreeNode> temp = new ArrayDeque<>(); // 辅助栈,用来处理回溯
    14. Deque<TreeNode> stack = new ArrayDeque<>(); // 记录后序遍历的顺序
    15. TreeNode cur = root;
    16. while (cur != null || !temp.isEmpty()) {
    17. if (cur != null) {
    18. temp.push(cur);
    19. stack.push(cur);
    20. cur = cur.right;
    21. } else {
    22. cur = temp.pop().left;
    23. }
    24. }
    25. while (!stack.isEmpty()) {
    26. ans.add(stack.pop().val);
    27. }
    28. return ans;
    29. }
    30. }