思路:dfs
边界:遇到 p 或者 q 或者nullptr,直接return。就不向下搜索了, 原因是:节点也是自己的祖先,当节点q 在p的子树上时,return p即可。
当l 和 r都不为空时,说明一个在左子树,一个在右子树,此时return root。否则返回不为空的那个,都为空返回空(l ? l : r 包括了这三种情况)
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root == nullptr || root == p || root == q) return root;
auto l = lowestCommonAncestor(root->left, p, q);
auto r = lowestCommonAncestor(root->right, p, q);
if (l && r) return root;
return l ? l : r;
}
};