给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例 :
给定二叉树
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
思路:
直径最大分为三种情况:
最大直径在:
1、根节点左子树
2、根节点右子树
3、包括根节点
再想一下,维持一个全局变量存储最大直径res,我们每次去递归当前节点往左右找,取max(根节点得到的最大直径,res)【似乎是取得第三种情况】
由于递归会往左右子树去找,并且判断更新res,所以还是相当于把上述的1、2种情况覆盖了,取的最大值。
int res = 0;
public int diameterOfBinaryTree(TreeNode root) {
depth(root);
return res;
}
public int depth(TreeNode node) {
if (node == null) {
return 0;
}
int Left = depth(node.left);
int Right = depth(node.right);
//看题目 相当于是求边的数量 注意注意注意!!!
res = Math.max(Left + Right, res);//将每个节点最大直径,不是节点个数(左子树深度+右子树深度)当前最大值比较并取大者
return Math.max(Left, Right) + 1;//返回树深度
}