/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @param o1 int整型 
     * @param o2 int整型 
     * @return int整型
     */
    int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
        if (!root) {
            return -1;
        }
        if (root->val == o1 || root->val == o2) {
            return root->val;
        }
        int l = lowestCommonAncestor(root->left, o1, o2);
        int r = lowestCommonAncestor(root->right, o1, o2);
        if (l == -1) {
            return r;
        }
        if (r == -1) {
            return l;
        }
        return root->val;
    }
};

思路:树形结构一般都是递归。

* 因为节点值都是非负的,所以返回-1表示在这棵子树上没找到对应的值。

* 如果当前节点的值就是两者之一,则直接返回当前节点的值。

** 如果另一个值在当前节点的子节点,那么当前节点的值就是正确答案。

** 否则在后续逻辑进行处理。

* 递归对左右子节点求值。

** 左右子节点中有一个为-1,因为题目保证一定能找到,所以直接返回另一个子节点的结果。(另一个子节点是-1也没关系,说明不在当前递归分支)

** 左右子节点均不为-1,说明要找的两个数分别在左右子树中,那么它们的最近公共祖先就是当前节点。