这题是非常好的递归题!!
当我们用递归去做这个题时不要被题目误导,应该要明确一点
这个函数的功能有三个:给定两个节点p和q
1.如果p和q都存在,则返回它们的公共祖先;
2.如果只存在一个,则返回存在的一个;
3.如果p和q都不存在,则返回NULL;
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root == NULL)return NULL;//递归结束的条件
if (root == p || root == q)//递归结束的条件
return root;
TreeNode*left = lowestCommonAncestor(root->left, p, q);//在左子树中找两个节点的最近公共祖先(假设已经完成)
TreeNode*right = lowestCommonAncestor(root->right, p, q);//在右子树中找两个节点的最近公共祖先(假设已经完成)
if (left == NULL)//说明p、q都在右子树
return right;
else if (right == NULL)//说明p、q都在左子树
return left;
else//说明p、q一个在左子树,另一个在右子树
return root;
}
};