① node == p / q
→ 找到了,直接回傳
② left 有、right 有
→ p q 分居左右
→ node 就是答案
③ 只有一邊有
→ 答案還在那一邊
→ 繼續往上傳
Tree 沒有 parent → 從 root 往下 DFS;recursion 的 return 本身就是往上傳結果
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* node, TreeNode* p, TreeNode* q) { // 從當下 node 找 p、q 的最低共同祖先
if (!node || node == p || node == q) // 沒節點,或已直接找到 p / q
return node; // 把找到的 node 往上一層回傳
TreeNode* left = lowestCommonAncestor(node->left, p, q); // 去左邊找 p / q
TreeNode* right = lowestCommonAncestor(node->right, p, q); // 去右邊找 p / q
if (left && right) // 左右兩邊都找到東西
return node; // p、q 分居兩邊 → 當下 node 就是 LCA
return left ? left : right; // 只有一邊找到 → 把那邊的結果往上傳
}
};