力扣第九十四题-二叉树的中序遍历

443 阅读2分钟

「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

前言

力扣第九十四题 二叉树的中序遍历 如下所示:

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

示例 1:

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

一、思路

这一题就不用过多的介绍了,二叉树的 前中后序 可谓是非常经典的题目了。

我们正好可以利用这一题复习一下二叉树的基础,你还记得什么时 前中后序 遍历二叉树吗?

  • 前序遍历:先根节点,再找左孩子,最后找右孩子
  • 中序遍历:先找左孩子,再找根节点,最后找右孩子
  • 后序遍历:先找左孩子,再找右孩子,最后找根节点

示例作为例子,它的 前中后序 遍历的结果分别如下图所示:

  1. 前序遍历

image.png

  1. 中序遍历

image.png

  1. 后序遍历

image.png

想要记住前中后序的顺序,有一个关键点:前中后 是指根节点的位置。(如中序遍历,就是根节点在中间,即 前根后
还有一点需要注意的是:遍历的顺序是指对于每一个节点都是相同的顺序遍历的。(以中序遍历为例,只要子树的左孩子不为空,就要优先读取)

二、实现

实现代码

实现的代码有两种方式:递归和遍历(推荐使用递归,代码更简洁,它两的时间和空间复杂度都是一样的)

递归

List<Integer> ret= new ArrayList<>();
/**
 * 中序遍历(左根右)
 */
public List<Integer> inorderTraversal(TreeNode root) {
    infixOrder(root);
    return ret;
}

// 中序
public void infixOrder(TreeNode root) {
    if (root == null)
        return;
    // 先找左孩子
    infixOrder(root.left);
    ret.add(root.val);
    // 后找右孩子
    infixOrder(root.right);
}

遍历

    public List<Integer> inorderTraversal1(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        Deque<TreeNode> stack = new ArrayDeque<>();
        while (root != null || !stack.isEmpty()) {
            // 先将所有左节点入栈
            while (root != null) {
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            res.add(root.val);
            root = root.right;
        }
        return res;
    }

测试代码

    public static void main(String[] args) {
        TreeNode treeNode = new TreeNode(1, null, new TreeNode(2, new TreeNode(3), null));
        new Number94().inorderTraversal(treeNode);
    }

结果

我这里的提交结果是使用的递归,使用遍历的击败率也是差不多的。

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~