二叉树直径的定义就是距离最长的两个结点所经过边的数目,由给定的Example可知,二叉树的直径可以近似地看作是左右子树的层数之和(左子树层数为2,右子树层数为1),为什么说是近似呢,因为可能最终找到的两个结点不经过根节点即两个结点来自同一边子树。如下图所示,最终找到的两个结点8和9,直径是6:
用mx=-1来保存当前求的的最大距离
具体的求解步骤如下:
node 8
left=0,right=0
level=max{left,right}+1=1
mx=max{mx,left+right}=0
node 6
left=1,right=0
level=max{left,right}+1=2
mx=max{mx,left+right}=1
node 4
left=2,right=0
level=max{left,right}+1=3
mx=max{mx,left+right}=2
node 9
left=0,right=0
level=max{left,right}+1=1
mx=max{mx,left+right}=2
node 7
left=0,right=1
level=max{left,right}+1=2
mx=max{mx,left+right}=2
node 5
left=0,right=2
level=max{left,right}+1=3
mx=max{mx,left+right}=2
node 2
left=3,right=3
level=max{left,right}+1=4
mx=max{mx,left+right}=6
node 3
left=0,right=0
level=max{left,right}+1=1
mx=max{mx,left+right}=6
node 1
left=4,right=1
level=max{left,right}+1=5
mx=max{mx,left+right}=6
故最终结果mx=6即为该二叉树的最大距离
具体的Java代码如下
static int mx;
public int diameterOfBinaryTree(TreeNode root) {
if(root==null)
return 0;
mx=-1;
int dj=CalcuLevel(root);
return mx;
}
public int CalcuLevel(TreeNode root) {
if(root==null) {
return 0;
}
int left=CalcuLevel(root.left);
int right=CalcuLevel(root.right);
int level=Math.max(left, right)+1;
mx=Math.max(left+right, mx);
return level;
}