题目描述
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
注意:两结点之间的路径长度是以它们之间边的数目表示。
543. 二叉树的直径
解法1
从题目可以得知,二叉树的直径上的节点数是二叉树左子树的高度加上右子树的高度加 1。因为最后的直径是节点之间边的数目,所有最后返回还要减去1。合并起来,一棵树的直径是其左子树的最大高度和右子树最大高度的和。
我们可以用一个递归获得一棵树的高度,设置一个全局变量max来存最后要返回的直径,代码如下。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//最后要返回的直径
int max = 0;
public int diameterOfBinaryTree(TreeNode root) {
if (root == null) {
return 0;
}
redepth(root);
return max;
}
//获得一棵树的高度
public int redepth(TreeNode root) {
if (root == null) {
return 0;
}
//获得左子树的高度
int left = redepth(root.left);
//获得右子树的高度
int right = redepth(root.right);
//左子树的高度加右子树的高度就是当前节点的直径,跟记录的max比较一下,更新max值
max = Math.max(max, left + right);
//返回当前节点的最大高度
return Math.max(left, right) + 1;
}
}