给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。
示例 :
给定二叉树
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
注意:两结点之间的路径长度是以它们之间边的数目表示。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/diameter-of-binary-tree
测试用例:
- null
- 各种二叉树
分析:
对树的直径,如果把它拉成一条直线,只有三种情况:
1)只有一个根节点
2)一端是叶节点一端是根节点
3)两端都是叶节点。
分析到这我误认为这直径必须包含根节点。。自己也不知道为什么
经过矫正后的思想是,这条直径必须包含分支点(可能是根节点)。知道这一点后就只需要把每个点的左右节点的高度加起来,最大者即为其直径。遍历树以算点的高度已经做过,只需要在这上面做一点改进则可解此题。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private int diameter = 0;
public int diameterOfBinaryTree(TreeNode root) {
diameterOfBinaryTreeAux(root);
return diameter;
}
public int diameterOfBinaryTreeAux(TreeNode root) {
if(root == null) return 0;
int left = diameterOfBinaryTreeAux(root.left);
int right = diameterOfBinaryTreeAux(root.right);
diameter = Math.max(diameter, left+right);
return 1 + Math.max(left, right);
}
}