题目
给定一个根为 root 的二叉树
,每个结点的深度是它到根的最短距离。
如果一个结点在整个树的任意结点之间具有最大的深度,则该结点是最深的。
一个结点的子树是该结点加上它的所有后代的集合。
返回能满足“以该结点为根的子树中包含所有最深的结点”这一条件的具有最大深度的结点。
提示:
树中结点的数量介于 1 和 500 之间。
每个结点的值都是独一无二的。
示例:
解题思路
最终要的结果是返回包含所有
最深
节点的子树
(包括本身)
- 计算根节点左边和右边的最大深度(如果深度一样, 则答案就是它本身)
- 递归计算深度较大的一边的深度直到比较完所有子数
public TreeNode subtreeWithAllDeepest(TreeNode root) {
if (root == null) {
return null;
}
long left = 0;
long right = 0;
left = findDeepest(root.left);
right = findDeepest(root.right);
if (left == right) return root;
if (left > right) {
return subtreeWithAllDeepest(root.left);
} else {
return subtreeWithAllDeepest(root.right);
}
}
private long findDeepest(TreeNode node) {
if (node == null) {
return 0;
}
return Math.max(findDeepest(node.left), findDeepest(node.right)) + 1;
}
扩展
题目我们是解出来了, 但是最要命的是有个提示, 说明肯定有更高效的算法(这种暴力遍历确实不够高效)
- 树中结点的数量介于 1 和 500 之间。
- 每个结点的值都是独一无二的。