大家好!我是曾续缘💕
今天是《LeetCode 热题 100》系列
发车第 49 天
二叉树第 14 题
❤️点赞 👍 收藏 ⭐再看,养成习惯
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 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
均存在于给定的二叉树中。
解题方法
我们采用递归方式遍历整棵二叉树,将遍历到的目标节点p
和q
同时向上传,对于当前节点,如果p
和q
传到了左右子树,说明当前节点就是p
和q
的最近公共祖先,否则只会上传一个p
或q
,因为另一个目标节点在一个目标节点的子树下。
递归终止条件:当到达空节点时,说明没找到,返回空节点;只有当找到目标节点
p
或q
时,直接返回该节点。递归调用:在每个节点处,递归调用左右子树,并根据子树的返回结果在当前节点进行判断:
- 若左子树返回值为
null
,说明答案不可能在左子树,可能在右子树中,直接返回右子树的结果。 - 若右子树返回值为
null
,说明答案不可能在右子树,可能在左子树中,直接返回左子树的结果。 - 若左右子树返回值均不为空,说明传到给左右子树的结果分别是
p
和q
,说明当前节点是最近公共祖先,直接返回当前节点。
- 若左子树返回值为
总结一下,就是除了null
, 只有p
,q
和最近公共祖先
三种节点才有可能会被返回,最后返回的就是最近公共祖先。
Code
查看代码
java
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null || root == p || root == q){
return root;
}
TreeNode l = lowestCommonAncestor(root.left, p, q);
TreeNode r = lowestCommonAncestor(root.right, p ,q);
if(l == null){
return r;
}
if(r == null){
return l;
}
return root;
}
}