Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a binary tree is the length of the longest path between any two nodes in a tree. This path may or may not pass through the root.
Example:
Given a binary tree
1 / \ 2 3 / \ 4 5
Return 3, which is the length of the path [4,2,1,3] or [5,2,1,3].
Note: The length of path between two nodes is represented by the number of edges between them.
翻译:给定一个二叉树,你需要计算出二叉树的直径长度。二叉树直径的长度就是树中任意两节点间的最长长度。这个路径可能经过根节点也可能不经过。
注意:两个节点间的路径长度表示为它们之间的边数。
最远的路径,两端一定是两个叶子节点,且该两个节点必有公共祖先(所有的节点均是由根节点出发的)。所以依次遍历每一个可能的祖先(即遍历每个节点),看其最多能延伸到什么程度。此题我采用先序遍历。
对每一个节点来说,它能延伸的长度取决于它的左右孩子,如果它没有左右孩子,则长度为0;
①如果只有左孩子,则它能延伸的长度为其 右孩子的深度+1;(+1为该节点与右孩子之间的边长度)。
②如果只有右孩子,则它能延伸的长度为其 左孩子的深度+1;
③如果左右孩子都有,则它能延伸的长度为 左孩子的深度+1+右孩子的深度+1;
取所有节点中延伸长度最大的数,即为二叉树的直径长度。
private int max=0;
public int diameterOfBinaryTree(TreeNode root) {
if(root==null)return 0;
if(root.left==null&&root.right==null)return 0;
int temp=0;
if(root.left==null) temp=deepOfNode(root.right)+1;
else if(root.right==null) temp=deepOfNode(root.left)+1;
else temp=deepOfNode(root.left)+deepOfNode(root.right)+2;
max=max>temp?max:temp;
diameterOfBinaryTree(root.left);
diameterOfBinaryTree(root.right);
return max;
}
private int deepOfNode(TreeNode root){
if(root==null)return 0;
if(root.left==null&&root.right==null)return 0;
int leftDepth=deepOfNode(root.left);
int rightDepth=deepOfNode(root.right);
return 1+(leftDepth>rightDepth?leftDepth:rightDepth);
}
还是一样,有二叉树想递归,想遍历。