leetcode 精选100题(4) 二叉树的最大深度-简单

题目 

分析 

很开心,这个题目自己做出来了。按照昨天写二叉树递归的方法,进行思考。

计算的是节点的深度,需要对左右子树都进行遍历。

因此递归形式一定是:

deep(root.left, xxx);
deep(root.right, xxx);

并且节点的深度在递归过程中是逐渐叠加的,所以,这里的 xxx 一定是当前节点的深度。

递归返回的是一个数值。

在当前节点不存在的时候,直接返回初始的 len。

我的代码如下:

/**
 * @param {TreeNode} root
 * @return {number}
 */
var maxDepth = function(root) {
    let len =1;
    let maxNode=(node, len)=>{
        if(!node) return len;
        let leftLen = node.left ? maxNode(node.left, len+1): len;
        let rightLen = node.right ? maxNode(node.right, len+1): len;
        return leftLen > rightLen ? leftLen : rightLen; 
    }
    return root ? maxNode(root, 1) : 0;
};

代码优化

在看过他人的题解(点击蓝色字体访问:力扣题解)之后,发现了我的代码思路中的一些问题。

问题 1:初始化 len 为 1,这样把 root 为空的情况排除在了递归之外。

问题 2:得到左右子树深度的逻辑冗余。不需要再次进行判断。

问题 2:比较左右子树深度的代码不够简洁。

根据以上两个问题,进行优化后的代码为:

var maxDepth = function(root) {
    let maxNode=(node, len)=>{
        if(!node) return len;
        // 用 加一 去表示当前子树的深度
        let leftLen = 1 + maxNode(node.left, len);
        let rightLen = 1+ maxNode(node.right, len);
        // 用 js 自带的 math 对象中的 max 函数去取代三元运算,语义性更清晰了
        return Math.max(leftLen, rightLen); 
    }
    return maxNode(root, 0);
};

总结

能够自己写出来,就说明已经慢慢掌握了二叉树的精髓啦。但是,对于递归应该做的工作,以及如何更好的实现还是需要提高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值