注意两点

  1. dfs 函数的返回值
  2. if (!res ... 确保返回最近公共祖先 (后序遍历第一个同时找到 p & q ) → 否者会返回根节点
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        dfs(root, p, q);
        return res;
    }
private:
    TreeNode *res;
    // p -> 0b10
    // q -> 0b01
    int dfs(TreeNode* root, TreeNode* p, TreeNode* q) {
				if (!root) return;
        int state = 0;
        state |= dfs(root->left, p, q);
        state |= dfs(root->right, p, q);
        if (root == p) state |= 0b10;
        if (root == q) state |= 0b01;
        if (!res && state == 0b11) {
            res = root;
        }
        return state;
    }
};