力扣100——二叉树的中序遍历

114 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;
}