字节高频面试题( 543. 二叉树的直径 - 力扣(LeetCode) )
题干: 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
题的意思是:给你一个数求这个树的某两个节点的最大距离
示例 : 给定二叉树 :
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
解题思路: (二叉树递归)
对给的根节点root来说有两种情况:第一种就是:两个点的最大距离在root的两侧,距离也会途经root;第二种就是:两个点都在root的一侧,距离也不经过root
第一种情况:
1 / \ 2 3 / 4
这个树的最大距离为3(4 -> 2 -> 1 -> 3),与root(1)有关,此时思路为:
root的最大距离 等于 左节点的高度 与 右节点的高度 之和。(如此时左节点高度为2,右节点高度为1)
第二种情况:
2 \ 5 / \ 7 6 / \ \ 4 5 9这个树的最大距离为4(4 -> 7 -> 5 -> 6 -> 9),与root(2)无关,此时思路为:
root的最大距离 等于 右节点的最大距离;又因为也可能
2 / 5 / \ 7 6 / \ \ 4 5 9所以root的最大距离等于左节点的最大距离 与 右节点的最大距离 的最大值
我们需要递归的是最大距离与高度,我们建立这个类:
public static class Info{
public int maxDistance; //最大距离
public int height; //高度
public Info(int m, int h) {
maxDistance = m;
height = h;
}
}
递归方法:
public static Info Dig(TreeNode root) {
if (root == null) { //如果为空,最大距离和最大高度都为0
return new Info(0, 0);
}
Info left = Dig(root.left); //获得左子树的,最大距离和高度
Info right = Dig(root.right); //获得右子树的,最大距离和高度
int height = Math.max(left.height,right.height) + 1; //更新root的高度
int p1 = Math.max(left.maxDistance,right.maxDistance); //当第二种情况最大距离不经过root时
int p2 = left.height + right.height; //第一种情况最大距离经过root时
int MaxDistance = Math.max(p1,p2); //取两种方法的最大值
return new Info(MaxDistance,height);
}
完整代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int diameterOfBinaryTree(TreeNode root) {
return Dig(root).maxDistance;
}
public static class Info{
public int maxDistance;
public int height;
public Info(int m, int h) {
maxDistance = m;
height = h;
}
}
public static Info Dig(TreeNode root) {
if (root == null) {
return new Info(0, 0);
}
Info left = Dig(root.left);
Info right = Dig(root.right);
int height = Math.max(left.height,right.height) + 1;
int p1 = Math.max(left.maxDistance,right.maxDistance);
int p2 = left.height + right.height;
int MaxDistance = Math.max(p1,p2);
return new Info(MaxDistance,height);
}
}
\