import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @param o1 int整型 
     * @param o2 int整型 
     * @return int整型
     */
    /**
     *                                1
     *                          2           3
     *                       4      5     6     7
     *  情况1:
     *  o1或o2 = 1 直接返回根节点
     *  
     *  情况2:
     *  o1 = 2 o2 =3 前序遍历到2时 left = 2 然后前序遍历直接遍历到了3 返回1
     *  
     *  情况3:
     *  o1 = 2 o2 = 5 前序遍历到2停止遍历 left = 2 然后遍历 3 6 7 right = 0 left!=null 返回2
     *  
     *  情况4:
     *  o1 = 4 o2 = 6 前序遍历到4 left = 4 接着遍历5 left=2 right=0 返回2 前序遍历递归返回 当前root=1 接着遍历 3 6 7 left = 6 right = 0 返回6 left right都不为0 返回根节点1
     *  
     *  剩下的情况类似
     */
    public int lowestCommonAncestor (TreeNode root, int o1, int o2) {

        /**
         * 给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2 说明root为非null 并且 o1 o2为树上的节点 不存在o1 o2为莫须有的节点
         * 
         * 前序遍历二叉树,当遍历到叶子节点的时候 即叶子节点的左右子树为null 此时返回0
         */
        if (root == null) {
            return 0;
        }

        //遍历的当前节点与o1或o2 相同时,直接返回其命中的值
        if (root.val == o1 || root.val == o2) {
            return root.val;
        }

        //前序遍历二叉树 此时递归遍历树的左孩子 命中目标后 直接结束遍历 没命中时 继续遍历
        int left = lowestCommonAncestor(root.left, o1, o2);

        //前序遍历二叉树 此时递归遍历树的右孩子
        int right = lowestCommonAncestor(root.right, o1, o2);

        //当左孩子和右孩子 都不为0时,说明此时的root节点为o1 o2的最近公共祖先
        if (left != 0 && right != 0) {
            return root.val;
        }

        //上面的条件 必有left=0 或 right=0 
        if (left != 0) {
            return left;
        }

        if (right != 0) {
            return right;
        }

        //left right都等于0 说明当前整个左子树没有命中O1 O2
        return 0;

    }
}