/*
 * function TreeNode(x) {
 *   this.val = x;
 *   this.left = null;
 *   this.right = null;
 * }
 */

/**
 * 
 * @param root TreeNode类 
 * @param o1 int整型 
 * @param o2 int整型 
 * @return int整型
 */
/**
 * 
 * 我们想想最近公共祖先节点满足什么要求??
o1和o2分别位于这个节点的两个子树里
也就说,如果存在一个节点,从左子树出发能找到o1或o2,从右子树出发也能找到,那就说明这个节点就是最近公共祖先节点
但是注意特殊情况,因为有可能全部在左子树,或者右子树,那最近公共祖先点就是他们本身(离根更近的那个)
 */
function lowestCommonAncestor( root ,  o1 ,  o2 ) {
    //遇到叶子节点返回null
    if(root === null) {
        return null;
    }
    //如果p或q为根节点,则p或q为最近公共祖先
    if(root.val === o1 || root.val === o2) {
        return root.val;
    }
    // 在左子树寻找p和q的最近公共祖先
    let left = lowestCommonAncestor( root.left ,  o1 ,  o2 );
    // 在右子树寻找q和q的最近公共祖先
    let right = lowestCommonAncestor( root.right ,  o1 ,  o2 );
    // 如果p和q分属两侧,则根节点为最近公共祖先
    if(left !== null && right !== null) {
        return root.val;
    }
    // 如果左子树有值,则最近公共祖先在左子树,否则,在右子树
    return left !== null ? left : right;
}
module.exports = {
    lowestCommonAncestor : lowestCommonAncestor
};