持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情
力扣100——二叉树的中序遍历
题目
今天的力扣100题是二叉树的中序遍历,这道题目在面试当中经常会碰到,题目是:按照中序遍历的方法来遍历一棵二叉树。
思路
看见遍历二叉树,我们首先应该想到通过递归的方法来对二叉树进行遍历,递归的方法很简单,我们首先递归左子树的节点root.left
,直到指向左子树的底部,我们将其值存入数组当中,然后我们开始对左子树底部的右子节点进行递归。以此类推,当一棵树的左右子树都被递归完成,那么这棵树的遍历也就完成了。
还有一种非常常用的树遍历方法——迭代法。迭代的方法和递归有点类似,都是先将左子树先迭代完,然后再去找对应节点的右子树,不同的是,递归的时候,js引擎会为我们维护一个递归调用栈,但是在迭代的时候,需要我们自己来维护一个节点的迭代栈。
下面是两种方式的解法:
解法
- 递归
/**
* @param {TreeNode} root
* @param {number[]} returnRoot
* @return {number[]}
*/
const inorderTraversal = function(root,returnRoot = []){
// 判断当前二叉树的节点是否存在
if(root){
// 对左子树进行遍历
inorderTraversal(root.left,returnRoot);
// 将节点的值添加到数组当中
returnRoot.push(root.val);
// 对右子树进行遍历
inorderTraversal(root.right,returnRoot);
}
// 返回遍历完成的数组
return returnRoot;
}
- 迭代
/**
* @param {TreeNode} root
* @return {number[]}
*/
var inorderTraversal = function(root) {
// 创建一个返回的数组
let res = [];
// 创建一个栈,来存储迭代的树节点
let stack = [];
// 判断当前节点是否存在,或者stack当中是否存在树节点
while(root || stack.length) {
// 如果根节点当中存在子节点,那么我们首先将节点入栈,然后将root = root.left。迭代下一层的左节点
while(root) {
stack.push(root);
root = root.left;
}
// 左节点迭代完成,从栈顶开始出栈,获取栈顶节点的值,存起来
root = stack.pop();
res.push(root.val);
// 开始遍历右子节点数
root = root.right;
}
return res;
}