36.二叉树的中序遍历(学习)
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
示例 1:
输入:root = [1,null,2,3]
输出:[1,3,2]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
提示:
树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100
解析:
一、inorderTraversal 函数:
1.这是主函数,它接收二叉树的根节点 root 作为参数,并返回中序遍历的结果(一个包含节点值的数组)。
2.函数内部首先初始化一个空数组 result 来存储遍历的结果。
3.然后,它定义了一个内部递归函数 traverse,该函数用于执行实际的遍历逻辑。
二、traverse 递归函数:
1.递归基准情形:如果当前节点 node 为空(即没有子树可遍历),则函数直接返回。这是递归的基准情形,用于防止无限递归。
2.遍历左子树:首先,递归调用 traverse 函数来遍历左子树。这确保了“左”部分的节点先被访问。
3.访问根节点:然后,将当前节点的值 node.val 添加到 result 数组中。这对应于“根”部分的访问。
4.遍历右子树:最后,递归调用 traverse 函数来遍历右子树。这确保了“右”部分的节点在根节点之后被访问。
三、执行和结果:
1.当 traverse 函数被初始调用(以根节点为参数)时,它会递归地遍历整棵树,按照“左-根-右”的顺序将节点的值添加到 result 数组中。最终,当所有的递归调用都返回时,result 数组将包含中序遍历的结果,该结果被 inorderTraversal 函数返回。
var inorderTraversal = function (root) {
let result = [];
function traverse(node) {
if (node === null) {
return;
}
// 先遍历左子树
traverse(node.left);
// 访问根节点
result.push(node.val);
// 再遍历右子树
traverse(node.right);
}
traverse(root);
return result;
};