力扣【二叉树专题】543. 二叉树的直径

121 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 5 天,点击查看活动详情

题目链接

543. 二叉树的直径 - 力扣(LeetCode)

题目描述

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。

测试用例

示例 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);
    }
};

image.png