小鱼刷leetcode---543. 二叉树的直径

24 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情

一、题目描述:

543. 二叉树的直径

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

示例 :

给定二叉树

          1
         / \
        2   3
       / \     
      4   5   

返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

注意:两结点之间的路径长度是以它们之间边的数目表示。

二、思路分析:

不能够直接简单的将根节点的左右子树高度相加,因为,路径不一定经过根节点!

应该遍历所有节点,记录以此节点为根的子树的直径:左子树高度 + 右子树高度,取最大值

说白了,就是不能单单的算经过根节点的直径,而是应该算经过每个节点的直径,取最大值

用一个变量来记录最大值,每个节点都要去判断【当前节点的左子树高度+右子树高度】是否大于最大值变量,大于就更新最大值

公式:
cur节点的直径 = cur左子树高度 + cur右子树高度
cur节点的高度 = max(cur左子树高度, cur右子树高度) + 1

三、AC 代码:

/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     public $val = null;
 *     public $left = null;
 *     public $right = null;
 *     function __construct($val = 0, $left = null, $right = null) {
 *         $this->val = $val;
 *         $this->left = $left;
 *         $this->right = $right;
 *     }
 * }
 */
class Solution {

    /**
     * @param TreeNode $root
     * @return Integer
     */
    function diameterOfBinaryTree($root) {
        $res = 0; // 记录直径最大值
        $this->dfs($root, $res);

        return $res;
    }

    function dfs($root, &$res) {
        if ($root == null) return 0;

        $left = $this->dfs($root->left, $res);
        $right =$this->dfs($root->right, $res);
        $res = max($res, $left + $right);

        return max($left, $right) + 1;
    }
}

范文参考:

【C++】543. 二叉树的直径 题解:后序遍历&递归 - 二叉树的直径 - 力扣(LeetCode)

纯c,递归解决大部分树问题,dfs,注释超级详细 - 二叉树的直径 - 力扣(LeetCode)