Appearance
0236-二叉树的最近公共祖先
https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 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, 10^5] 内。
-10^9 <= Node.val <= 10^9
所有 Node.val 互不相同 。
p != q
p 和 q 均存在于给定的二叉树中。
思路 【官方,需要思考】
从 root 开始寻找,如果 root == q 或者 root == p 那么 root 就是最近公共祖先 如果不是,那么从 root.left 中寻找 p, q , 从 root.right 中也寻找 p,q 如果分别在左右节点中都寻找到了,那么就返回root 否则 哪个节点不为空,就返回哪个节点
注意: 左右节点分别寻找的也是 LowestCommonAnchestor 会递归找下去
参考代码
csharp
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;
}
else if(left != null){
return left;
}
else{
return right;
}
}
}
参考代码:复习20220410
csharp
public class Solution {
//问题:如何递归判断两个节点 p,q
private bool hasNode(TreeNode root, TreeNode node){
if(root == null){
return false;
}
if(root.val == node.val){
return true;
}
return hasNode(root.left,node) || hasNode(root.right,node);
}
public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null){
return null;
}
if(hasNode(root.left,p) && hasNode(root.left,q)){
return LowestCommonAncestor(root.left,p,q);
}
else if(hasNode(root.right,p) && hasNode(root.right,q)){
return LowestCommonAncestor(root.right,p,q);
}
else{
return root;
}
}
}
参考代码:复习官方20200410
重点: LowestCommonAncestor 也作为找寻下一个节点的返回公众祖先的函数
csharp
public class Solution {
public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null || root.val == p.val || root.val == q.val){
return root;
}
TreeNode left = LowestCommonAncestor(root.left, p, q);
TreeNode right = LowestCommonAncestor(root.right, p, q);
if(left != null && right != null){
return root;
}
else if(left == null){
return right;
}
else{
return left;
}
}
}
AlgoPress