LeetCode 543. 二叉树的直径
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。
自己的思路:非常不好
一个二叉树的最大直径 = max { 左子树的最大直径,右子树的最大直径,左子树深度+右子树深度 }
class Solution {
//思路一个二叉树的最大直径,应该是根节点左子树的深度加上右子树的深度
public int diameterOfBinaryTree(TreeNode root) {
if(root == null){
return 0;
}
return Math.max(Math.max(diameterOfBinaryTree(root.left),diameterOfBinaryTree(root.right)),deepth(root.left) + deepth(root.right));
}
// 一个方法,输入根节点,可以计算深度。
public int deepth(TreeNode root){
if(root == null){
return 0;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
int dep = 0;
while(!queue.isEmpty()){
int size = queue.size();
for(int i = 0; i<size; i++){
TreeNode node = queue.remove();
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
}
dep ++;
}
return dep;
}
}
好的思路
无论如何,一个路径一定会有一个最近的公共父结点。路径长度 = 这个父结点的左右子树深度和
我们只需要遍历所有结点的左右子树深度和,找到最大的那个值就可以了。
深度优先遍历,设定一个成员变量,记录最大的直径。
class Solution {
int res = 0;
public int diameterOfBinaryTree(TreeNode root) {
if(root == null) return 0;
dep(root);
return res;
}
public int dep(TreeNode node){
if(node == null) return 0;
int L = dep(node.left);
int R = dep(node.right);
res = Math.max(res, L+R);
return Math.max(L, R) +1;
}
}