开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情
一、题目描述:
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例 :
给定二叉树
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;
}
}