package tree;
/**
* 235. 二叉搜索树的最近公共祖先
* 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
*
* 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
*
* @author :Tang
* @date 2021/7/19
*/
public class LowestCommonAncestor {
int small = 0;
int big = 0;
/**
* 因为是二叉搜索树
* 通过判断当前节点的大小来判断是不是公共祖先
* 当前节点大于p && 小于q 说明当前节点是公共祖先
* 如果当前节点小于p 则递归当前节点的右子节点
* 如果当前节点大于q 则递归当前节点的左子节点
* (这里默认认为节点p的值大于节点q的值)
*
* @param root
* @param p
* @param q
* @return
*/
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
big = Math.max(p.val, q.val);
small = Math.min(p.val, q.val);
return preSearch(root);
}
private TreeNode preSearch(TreeNode node){
if(node == null){
return null;
}
if(node.val < small){
return preSearch(node.right);
}
if(node.val > big){
return preSearch(node.left);
}
return node;
}
public static void main(String[] args) {
TreeNode node1 = new TreeNode(6);
TreeNode node2 = new TreeNode(2);
TreeNode node3 = new TreeNode(8);
TreeNode node4 = new TreeNode(0);
TreeNode node5 = new TreeNode(4);
TreeNode node6 = new TreeNode(7);
TreeNode node7 = new TreeNode(9);
TreeNode node8 = new TreeNode(3);
TreeNode node9 = new TreeNode(5);
node1.left = node2;
node1.right = node3;
node2.left = node4;
node2.right = node5;
node3.left = node6;
node3.right = node7;
node5.left = node8;
node5.right = node9;
System.out.println(new LowestCommonAncestor().lowestCommonAncestor(node1, node2, node5).val);
}
}