「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」
题目:
543. 二叉树的直径
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例 : 给定二叉树
示例 :
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
注意: 两结点之间的路径长度是以它们之间边的数目表示。
思路:
- 设计到树结构,啥也不说先写个递归,不清楚的可以看一下我之前的文章二叉树入门教程juejin.cn/post/702785…
- 这道题目可能看起来比较复杂,实际上可以转化为求每个节点的左右两个节点的最长路径
- 写个方法求某个节点的左右路径最大值之和、以及当前节点的最长路径(左或者右)
实现:
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var diameterOfBinaryTree = function(root) {
// 递归问题直接把根节点抛进去就好了
let { maxValue } = findNodeMaxPath(root)
return maxValue;
};
var findNodeMaxPath = function(node, maxValue = 0) {
// 如果没有子节点就不用算了
if (!node) {
return { maxValue, maxCount: 0 };
}
// 把求解的路径交给左右两个节点去递归计算
let leftMax = findNodeMaxPath(node.left, maxValue);
let rightMax = findNodeMaxPath(node.right, maxValue);
// 比较每个节点的最长路径
maxValue = Math.max(
...[leftMax.maxValue, rightMax.maxValue, leftMax.maxCount + rightMax.maxCount]
);
// 记录每个节点的最长边, 给父节点使用
maxCount = Math.max(leftMax.maxCount, rightMax.maxCount) + 1;
return { maxValue, maxCount };
}
总结:
这道题目看懂题目就简单了很多,求两个节点的最长路径,其实就是求某个节点的左右路径之和。想明白了这一步,写个方法求和然后递归树节点去执行就完事了。
看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。