「这是我参与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,有空就会更新,大家多多支持,点个赞👍
如果大家有好的解法,或者发现本文理解不对的地方,欢迎留言评论 😄