import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */
// 懒人编程法:自顶向下,把问题抛给子树
// 二叉搜索树的特性:按照前序遍历从小到大放置元素值,一个节点的左子树所有节点值都小于此节点值,小于右子树所有节点值。
// 比较p,q,根节点的值,如果p、q在根节点的两端,则根节点就是其第一个公共结点,如果在一端,则抛给左子树或者右子树。
// 终止条件:p、q在根节点的两端。本级任务:判断终止条件。返回:子树处理此任务的结果。
// 时空复杂度:O(n)
public class Solution {
    public int lowestCommonAncestor (TreeNode root, int p, int q) {
        // write code here
        if ((p < root.val && root.val < q) || (q < root.val && root.val < p) || (p == root.val) || (q == root.val))
            return root.val;
        if (p < root.val && q < root.val)
            return lowestCommonAncestor(root.left, p, q);
        else
            return lowestCommonAncestor(root.right, p, q);
    }
}