标签:
数、递归
题目:
给定一颗二叉树,求二叉树的直径。
1.该题的直径定义为:树上任意两个节点路径长度的最大值
2.该题路径长度定义为:不需要从根节点开始,也不需要在叶子节点结束,也不需要必须从父节点到子节点,一个节点到底另外一个节点走的边的数目
3.这个路径可能穿过根节点,也可能不穿过
4.树为空时,返回 0
如,输入{1,2,3,#,#,4,5},二叉树如下:
那么:
从4到5的路径为4=>3=>5,路径长度为2
从4到2的路径为4=>3=>1=>2,路径长度为3
如,输入{1,2,3,#,#,4,5,9,#,#,6,#,7,#,8},二叉树如下:
那么路径长度最长为:7=>9=>4=>3=>5=>6=>8,长度为6
数据范围:节点数量满足0≤n≤100
反思:
这个题目自己在看题的时候被条件给看懵了,没有想到二叉树的最大直径如果以当前头节点为树,直径就是左右两颗子树的高度的相加。
因为是二叉树,所以有三种情况:
1、以root为头节点,直径为左右两个子树高度的相加。
2、以root.left为头节点,直径同上。
3、以root.right为头节点,直径同上。
然后取这三者的最大值即可。
用到的知识点:
数、递归
代码:
public int getTreeHeight(TreeNode root) {
if (root == null) {
return 0;
}
int lHeight = getTreeHeight(root.left);
int rHeight = getTreeHeight(root.right);
return lHeight > rHeight ? lHeight + 1 : rHeight + 1;
}
public int diameterOfBinaryTree (TreeNode root) {
// write code here
if (root == null) {
return 0;
}
int leftHeight = getTreeHeight(root.left);
int rightHeight = getTreeHeight(root.right);
int nowTreeHeight = leftHeight + rightHeight;
int leftTreeDiameterOfHeight = diameterOfBinaryTree(root.left);
int rightTreeDiameterOfHeight = diameterOfBinaryTree(root.right);
return nowTreeHeight > leftTreeDiameterOfHeight ? nowTreeHeight :
leftTreeDiameterOfHeight > rightTreeDiameterOfHeight ?
leftTreeDiameterOfHeight : rightTreeDiameterOfHeight;
}