一. 题目

二. 思路

  • 中序遍历:左根右顺序。

三. 代码

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);
        ans.add(cur.val);
        if (cur.right != null) dfs(cur.right);
    }

    public List<Integer> inorderTraversal(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> inorderTraversal(TreeNode root)
    {
        stk.clear();
        ans.clear();

        while (root != null || !stk.isEmpty())
        {
            while (root != null)//先遍历左儿子,直到没有左儿子
            {
                stk.offerLast(root);
                root = root.left;
            }

            root = stk.pollLast();//再遍历根
            ans.add(root.val);
            root = root.right;//再遍历右儿子
        }

        return ans;
    }
}