94.二叉树的中序遍历

1,131 阅读1分钟

1.题目

给定一个二叉树的根节点root,返回它的中序遍历。

示例 1:

输入:root = [1,null,2,3]

输出:[1,3,2]

示例 2:

输入:root = []

输出:[]

示例 3:

输入:root = [1]

输出:[1]

 示例 4:

输入:root = [1,2]

输出:[2,1]

 示例 5:

输入:root = [1,null,2]

输出:[1,2]

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

 

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

2.答题

2.1 思路1(递归)

递归,有限遍历左子树

代码如下:

/**
 * Definition for a binary tree node.
 * public 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 {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<Integer>();
        inorderTraversal(root, list);
        return list;
    }

    public void inorderTraversal(TreeNode root, List<Integer> list) {
        if (root == null) {
           return;
        }

        if (root.left != null) {
            inorderTraversal(root.left, list);
        }
        list.add(root.val);
        if (root.right != null) {
            inorderTraversal(root.right, list);
        }
    }
}

时间复杂度

O(n)

空间复杂度

O(n),由于使用了递归,会缓存调用栈,当二叉树弱化成了类链表结构时,会出现最差情况

提交结果

之前讲过,使用递归时需要注意:警惕堆栈溢出和警惕重复计算,在本题中可能遇到的情况是,二叉树深度过高,导致递归的调用栈深度过高,虽然时间复杂度不错。

2.2 思路2(非递归)

题目提示:使用迭代算法解决?

其实感觉使用回溯算法会更直接,从根节点开始遍历左子树,直到左子树为null,此时需要回溯到当前节点的父节点,将结点值放入结果中,以其右子树为根节点遍历其左子树,直到所有值遍历完成。

其实需要关注的是如何回溯到最后一个结点的父节点。此时需要一个数据结构存储当前执行的位置。

代码如下:

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<Integer>();
        List<TreeNode> cache = new ArrayList<>();

        while(root != null || !cache.isEmpty()) {
            if (root != null) {
                cache.add(root);
                root = root.left;
            } else {
                root = cache.remove(cache.size() - 1);
                list.add(root.val);
                root = root.right;
            }
        }
        
        return list;
    }
}

时间复杂度

O(n)

空间复杂度

O(n)

提交结果