给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
【分析】
- 如果这个二叉树有左右子树,那么最长的直径,一定是左边的叶子节点到右边的叶子节点
- 如果该二叉树只有一边有子树,那么最长的直径一定是,叶子节点到根节点 。
- 我们可以得到一个统一的模板 左子树 + 右子树,如果子树为null 就返回 0;
通过上述分析代码也是好写的,
- 先找到左边子树的叶子节点,返回其高度,
- 再找到右边的叶子节点返回其高度,
- 定义一个全局变量进行接收即可。
【代码】
package hot100;
import cn.msf.TreeNode;
public class DiameterOfBinaryTree {
int max = 0;
public static void main(String[] args) {
TreeNode root = new TreeNode(1);
TreeNode node1 = new TreeNode(2);
TreeNode node2 = new TreeNode(3);
TreeNode node3 = new TreeNode(4);
TreeNode node4 = new TreeNode(5);
root.left = node1;
root.right = node2;
node1.left = node3;
node1.right = node4;
int i = new DiameterOfBinaryTree().diameterOfBinaryTree(root);
System.out.println("i = " + i);
}
public int diameterOfBinaryTree(TreeNode root) {
if (root == null) {
return 0;
}
dfs(root);
return max;
}
private int dfs(TreeNode root) {
if (root.left == null && root.right == null) {
return 0;
}
int leftSize = root.left == null ? 0 : dfs(root.left) + 1;
int rightSize = root.right == null ? 0 : dfs(root.right) + 1;
max = Math.max(max,leftSize + rightSize);
return Math.max(leftSize,rightSize);
}
}