1.递归
设函数f(root,p,q)返回的是p,q的公共祖先,则有三种情况,公共祖先为根节点root,公共祖先在root的左子树中,公共祖先在root的右子树中,
函数f(root->left,p,q)是在根节点的左子树中寻找p,q的公共祖先,则右四种情况:公共祖先为节点root->left,公共祖先在root->left的左子树中,公共节点在root->left的右子树中,找不到公共节点,
对于root->right,同理,
则只需要设置递归出口条件,然后调用即可
代码如下:
/**
* 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) {
//出口:root为空,或者等于p,q
if(root==NULL||root==p||root==q)
return root;
//2.递归调用,从根节点的左右子树中查询
TreeNode *left=lowestCommonAncestor(root->left,p,q);
TreeNode *right=lowestCommonAncestor(root->right,p,q);
//3.判断公共祖先的位置
//3.1 在以root为根节点的左右子树中找到了p,q节点,则公共祖先为root
if(left&&right)
return root;
//3.2在以root为根节点的右子树中找到p,q节点
if(left&&right==NULL)
return left;
return right;
}
};