递归思路
- 首先判断当前节点是否命中(if(root == p || root == q)),命中则返回;
- 否则在当前节点的左右子树查找,然后比较左右子树的返回值;
- 如果两个返回值均不为空,说明p和q分别在左右子树,则输出为当前节点
- 如果只有其中一个为空,分两种情况:q(p)的子节点包含p(q);或者公共祖先在当前节点的子节点上;
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
{
if(root==p || root==q)
{
return root;
}
TreeNode* t1=NULL;
TreeNode* t2=NULL;
if(root->left)
{
t1 = lowestCommonAncestor(root->left,p,q);
}
if(root->right)
{
t2 = lowestCommonAncestor(root->right,p,q);
}
if(t1 && t2)
{
return root;
}
else
{
return t1 ? t1 : t2;
}
}