- 首先检查root节点是否是p或q,如果是,则直接返回root,因为p或q本身就是它们的最低公共祖先。
- 如果root是nullptr,说明已经搜索到了树的末端但还没有找到p或q,这种情况下也应该返回nullptr。
- 递归地在左子树和右子树中寻找p和q的最低公共祖先。
- 如果左子树和右子树的递归调用都返回了非空节点,说明p和q分别位于root的左右两个子树中,此时root就是它们的最低公共祖先。
- 如果左子树或右子树的递归调用返回了nullptr,说明p或q不在该子树中,此时应该返回非空的子树结果。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == p || root == q || root == nullptr){
return root;
}
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
if(left != nullptr && right != nullptr){
return root;
}
return left == nullptr ? right : left;
}
};