题目:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 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 。
思路:递归的思想,递归的结束条件是root == p || root == q
具体做法:
- pq 有三种情况。
(1)pq 分布在两个子树
(2)pq在一个子树
(3)pq都不存在(这种情况不需要考虑,题目描述中pq是肯定存在的)
第一种情况进行分析:
针对这种情况,递归的作用就是寻找pq,利用root->left和root->right 是否等于p或q 作为递归停止条件,找到了就返回root给left和right。
第二种情况:
这种情况下,pq都在一个子树内,若pq的深度不同,如上图找5和4 的公共祖先,p和q中有一个必被先找到。此时left和right一个有值,一个为空。则非空的为公共祖先。若pq深度相同,则原理同情况1.
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
//递归停止条件
if(root == nullptr)
return root;
if(root == p || root == q)
return root;
//递归进行查找
TreeNode* left = lowestCommonAncestor(root->left,p,q);
TreeNode* right = lowestCommonAncestor(root->right,p,q);
//找到pq后进行结果判定
if(left && right)
return root;
return left? left:right;
}
};