持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 5 天,点击查看活动详情
题目链接
题目描述
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
测试用例
示例 1:
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
注意: 两结点之间的路径长度是以它们之间边的数目表示。
限制
题目分析
题目里,对树的直径的定义,简单的理解为就是两个叶子节点通过一个公共父节点后的路径长度。如果需要求这个最大值,那么就需要这两个叶子节点,相对于他们的公共父节点,他们的层级需要尽可能的深。再换个角度,其实就是需要我们去求一个子树里,他的左右两个子节点的高度之和。既然需要求子树的高度,那么就需要用到后序遍历
在遍历的时候,若当前的节点为 null,则返回 -1;若当前的节点不为 null,则递归遍历他的左右子节点后,将其中最大的值作为此节点的高度返回;因为需要求这棵树的最大直径,我们需要在这一步,记录下他们的左右子树高度之和,并和全局记录的 max 比较,并判断替换
代码实现
完整的代码实现如下
var diameterOfBinaryTree = function (root) {
let max = 0;
trave(root);
return max;
function trave(node) {
if (node == null) return -1;
let lh = trave(node.left) + 1;
let rh = trave(node.right) + 1;
max = Math.max(lh + rh, max);
return Math.max(lh, rh);
}
};