一、题目粗心
给定一个二叉树, 找到该树中两个指定节点的最近公共先人。
百度百科中最近公共先人的定义为:“对于有根树 T 的两个节点 p、q,最近公共先人示意为一个节点 x,满足 x 是 p、q 的先人且 x 的深度尽可能大(一个节点也能够是它本人的先人)。”
示例 1:
输出:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输入:3
解释:节点 5 和节点 1 的最近公共先人是节点 3。
示例 2:
输出:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输入:5
解释:节点 5 和节点 4 的最近公共先人是节点 5。因为依据定义最近公共先人节点能够为节点自身。
示例 3:
输出:root = [1,2], p = 1, q = 2
输入:1
提醒:
- 树中节点数目在范畴 [2, 105] 内。
- -109 <= Node.val <= 109
- 所有 Node.val 互不雷同。
- p != q
- p 和 q 均存在于给定的二叉树中。
起源:力扣(LeetCode)
链接:https://leetcode.cn/problems/…
著作权归领扣网络所有。商业转载请分割官网受权,非商业转载请注明出处。
二、解题思路
这是 二叉搜寻树的最近公共先人 这题的衍生题,这道题是一般的二叉树,不是二叉搜寻树,所以就不能利其特有的性质,只能在二叉树中来搜寻 p 和 q,而后从门路中找到最初一个雷同的节点即为父节点,能够用递归来实现,在递归函数中,首先看以后节点是否为空,若为空则间接返回空;若为 p 或 q 中的任一个,也间接返回当着节点;否则的话就对其左右子节点别离调用递归函数。这道题限度了 p 和 q 肯定都在二叉树中存在,那么如果以后节点不等于 p 或 q,p 和 q 要么别离位于左右子树中,要么同时位于左子树,或者同时位于右子树:
若 p 和 q 别离位于左右子树中,对于左右子节点调用递归函数,别离返回 p 和 q 节点的地位,而以后节点正好是 p 和 q 的最小独特父节点,间接返回以后节点即可
若 p 和 q 同时位于左子树,有两种状况,一种是 left 会返回 p 和 q 中较高的那个地位,而 right 会返回空,所以最终返回非空的 left 即可,还有一种状况是返回 p 和 q 最小父节点,就是说以后节点的左子树中的某个节点才是 p 和 q 的最小父节点,会被返回。
若 p 和 q 同时位于右子树,和位于同时位于左子树相似。
三、解题办法
3.1 Java 实现
public class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if (root == null || root == p || root == q) {return root;}
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p, q);
if (left != null && right != null) {return root;}
return left != null ? left : right;
}
}
四、总结小记
- 2022/10/10 世界之大,无奇不有