LeetCode 👉 HOT 100 👉 二叉树的中序遍历 - 简单题

119 阅读2分钟

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」。

题目

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

示例1

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

输出:[1,3,2]

示例2

输入:root = []

输出:[]

示例3

输入:root = [1]

输出:[1]

思路

JavaScript 树:

    /**
    * Definition for a binary tree node.
    * function TreeNode(val, left, right) {
    *     this.val = (val===undefined ? 0 : val)
    *     this.left = (left===undefined ? null : left)
    *     this.right = (right===undefined ? null : right)
    * }
    */

这道题的难度不是很高,主要问题点在于理解什么是中序遍历:按照 左节点 - 根节点 - 右节点 的顺序依次访问树,当遇到 左节点、右节点 时,他们如果依然是二叉树的结构,那么也按照上面的顺序访问,直到遍历完整棵树。

由于树的结构,其实就是递归的,那么递归的解法,自然是最容易想到的:

  • 定义一个函数 dfs(root)

  • 函数接受一个节点作为参数,内部按照,先递归调用 dfs(root.left),保存 root.value,在递归调用 dfs(root.right),依次遍历整棵树即可

  • 递归的终止条件为 root == null

递归完整代码:

    /**
     * @param {TreeNode} root
     * @return {number[]}
     */
    var inorderTraversal = function (root) {
        const ans = [];

        const dfs = root => {

            // 终止递归
            if(!root) {
                return;
            }
            // 先访问左节点
            dfs(root.left);
            // 再保存跟节点数据
            ans.push(root.val);
            // 最后访问右节点
            dfs(root.right);
        }

        // 启动递归
        dfs(root)
        return ans;
    };

思考: 递归的解法,其实有用到 js 代码同步执行的特性,在第一次 dfs 函数执行的时候,走到 dfs(root.left) 时,会再次进入一个新的作用域,执行 dfs,而第一次执行的 dfs 函数里面的 ans.push(root.val);,会等到递归执行的 dfs 完成,才会执行。这也就是为什么 递归 可以解决 二叉树中序遍历 的原因。当然,如果 dfs 定义为一个异步函数,如 async dfs(root),就不行啦~

小结

关于二叉树的遍历,除了 中序遍历,当然还有 前序遍历:按照 根结点 - 左节点 - 右节点 的顺序访问;后序遍历:按照 左节点 - 右节点 - 根结点 的顺序访问。

三种遍历方式都可以使用递归的方式解决,且代码类似,只需要跟换一下访问节点的顺序就行~

LeetCode 👉 HOT 100 👉 二叉树的中序遍历 - 中等题

合集:LeetCode 👉 HOT 100,有空就会更新,大家多多支持,点个赞👍

如果大家有好的解法,或者发现本文理解不对的地方,欢迎留言评论 😄