题目描述
给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。

示例1
输入
[3,5,1,6,2,0,8,#,#,7,4],5,1
返回值
3

解法

    // 解法: 递归(后序遍历框架)
    //  终止条件:1. 越过叶节点,直接返回null; 2. root == o1 || root == o2, 返回 root.
    //  递归: 分别获得左右子树上的最近公共祖先节点. 
    //        left=lowestCommonAncestor(root->left, o1, o2)
    //        right=lowestCommonAncestor(root->right, o1, o2)
    //  返回结果:根据左右子树结果,判断最终返回结果。
    //        1. left == null && right == null, return null  // o1, o2 不在root的两子树上
    //        2. left == null && right != null, return right // o1, o2 在root 右子树
    //        3. left != null && right == null, retut left  // o1, o2 在root 左子树
    //        4. left != null && right != null, return root // o1, o2 分别root的两子树上
    // 时间O(N), 空间O(N)
    int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
        if (root == nullptr) return INT_MIN;
        if (root->val == o1 || root->val == o2) return root->val;
        int left = lowestCommonAncestor(root->left, o1, o2);
        int right = lowestCommonAncestor(root->right, o1, o2);
        if (left == INT_MIN ) return right;
        if (right == INT_MIN) return left;
        return root->val;
    }