难度:简单
题目:给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
本题的解法很容易想到的就是,要求任意两个结点路径的长度,就可以转化为求左节点的最大长度和右节点的最大长度。
所以我的代码如下:
class Solution {
public int diameterOfBinaryTree(TreeNode root) {
if(root == null) return 0;
return depth(root.left)+depth(root.right);
}
public int depth(TreeNode root){
if(root == null) return 0;
int leftMax=depth(root.left);
int rightMax=depth(root.right);
return Math.max(leftMax,rightMax)+1;
}
}
然而,没有通过全部测试案例:
问题的原因是:我考虑的都是从root结点出发的最大长度,然而会有一些不是从root结点出发的,如下图所示,因此,需要判断下最长的那个。最长的是8-6-4-2-3-5-7-9
修改之后:
class Solution {
int max=0;//记录最大长度
public int diameterOfBinaryTree(TreeNode root) {
if(root == null) return 0;
depth(root);
return max;
}
public int depth(TreeNode root){
if(root == null) return 0;
int leftMax=depth(root.left);
int rightMax=depth(root.right);
max=Math.max(leftMax+rightMax,max);//更新下max的值
return Math.max(leftMax,rightMax)+1;
}
}