class Solution {
public:
/*
定义递归函数:在以root为根节点的树中找到节点p,q的公共祖先节点并返回
此过程是暗含回溯的,不管有没有找到p,q都要返回值,从下向上返回值,第一时间想到自底向上的后序遍历
确定递归结束条件,当找到p,q的时候要返回,没找到即找到叶子节点的的时候也要返回
*/
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root==p||root==q||!root) return root;
TreeNode* left=lowestCommonAncestor(root->left,p,q);
TreeNode* right=lowestCommonAncestor(root->right,p,q);
/*以上已经遍历完左右子树不管有没有找到都会有一个返回值,并且返回的是一个新的节点
所以要新建TreeNode* 来接收他们的返回值
一下是对左右子树的判断
如果p,q都在左右子树都找到了,那么根就是他们的公共祖先
如果其中一个找到了 其中一个没找到,返回找到的那个
如果都没投找到就返回空
*/
if(left&&right) return root;
else if(!left&&right) return right;
else if(!right&&left) return left;
else return nullptr;//(!left&&!right)
}
};
class Solution {
public:
/*
平衡二叉树与二叉树求祖先的不同之处在于
可以根据平衡二叉树左小右大的性质去找p,q如果有节点在[p,q]这个区间,
这个节点就是他们的公共祖先
*/
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
while(root){
if(root->val<p->val&&root->val<q->val){
root=root->right;
}
else if(root->val>p->val&&root->val>q->val){
root=root->left;
}
else return root;
}
return nullptr;
}
};