一. 题目

二. 思路

  • 后序遍历:左友根

三. 代码

1. 递归

class TreeNode
{
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode()
    {
    }

    TreeNode(int val)
    {
        this.val = val;
    }

    TreeNode(int val, TreeNode left, TreeNode right)
    {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

class Solution
{
    final List<Integer> ans = new ArrayList<>();

    void dfs(TreeNode cur)
    {
        if (cur == null) return;
        if (cur.left != null) dfs(cur.left);
        if (cur.right != null) dfs(cur.right);
        ans.add(cur.val);
    }

    public List<Integer> postorderTraversal(TreeNode root)
    {
        ans.clear();
        dfs(root);
        return ans;
    }
}

2. 迭代

class Solution
{
    final List<Integer> ans = new ArrayList<>();
    final Deque<TreeNode> stk = new ArrayDeque<>(110);//栈

    public List<Integer> postorderTraversal(TreeNode root)
    {
        stk.clear();
        ans.clear();
        TreeNode pre = null;//前一个出栈的节点
        while (root != null || !stk.isEmpty())
        {
            while (root != null)//遍历左
            {
                stk.offerLast(root);
                root = root.left;
            }
            root = stk.pollLast();
            if (root.right == null || root.right == pre)//右边是空,或已经遍历过,该遍历根了
            {
                ans.add(root.val);
                pre = root;
                root = null;//该回到上一层了,当前的左右根遍历完了
            } else//右边还没遍历
            {
                stk.offerLast(root);//再次入栈
                root = root.right;
            }
        }

        return ans;
    }
}