/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root==NULL)
return NULL;
// dfs
if(root->val > p->val && root->val > q->val) // 说明p,q都在左子树中
// 去左子树中找p, q的公共祖先
return lowestCommonAncestor(root->left, p, q);
else if(root->val < p->val && root->val < q->val) // 说明p,q都在右子树中
// 去右子树中找p, q的公共祖先
return lowestCommonAncestor(root->right, p, q);
else // 一大一小,说明root就是祖先
return root;
}
};
下面给出一般二叉树求解公共祖先的方法
后序遍历。就一定要判断到节点为p或者q为止
二叉搜索树简化了这个过程,因为可以通过比较根节点与p,q结点的值来判断p,q的分布情况。而一般的二叉树,就得通过递归遍历来找到p, q给出反馈了
//如果是一般的二叉树
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == NULL)
return NULL;
//如果根节点就是p或者q,返回根节点
if(root == p || root == q)
return root;
//分别去左右子树里面找
// 如果只有left有反馈,说明公共祖先结点在左子树中,left即是在左子树中找到的公共结点
// 如果只有right有反馈,说明公共祖先结点在右子树中 说明公共祖先结点在左子树中,left即是在左子树中找到的公共结点
// 如果两边都有反馈,说明左右子树返回的分别是p和q,那么root就是公共祖先
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
// 后续遍历的visit,检验左右子树的反馈
if(left && right)//p,q各在一边,说明当前的根就是最近共同祖先
return root;
else if(left)//说明p,q都在左子树,则公共结点在左子树中
return left; // 返回在左子树中找到的公共结点
else if(right)//说明p,q都在右子树,则公共结点在右子树中
return right; // 返回在右子树中找到的公共结点
return NULL; // 以上均不满足,那就返回NULL了
}
};