题目
分析
很开心,这个题目自己做出来了。按照昨天写二叉树递归的方法,进行思考。
计算的是节点的深度,需要对左右子树都进行遍历。
因此递归形式一定是:
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);
};
总结
能够自己写出来,就说明已经慢慢掌握了二叉树的精髓啦。但是,对于递归应该做的工作,以及如何更好的实现还是需要提高。