题目描述:
235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode) (leetcode-cn.com)
Java代码一:
class Solution { //所有节点的值都是唯一的。 p、q 为不同节点且均存在于给定的二叉搜索树中。
TreeNode answer=null,p,q;
public boolean ancestor_and_descendent(TreeNode a,TreeNode d){ //判断a、d是否是祖先与后代的关系
if(a==null||d==null)return false;
if(a==d)return true;
return ancestor_and_descendent(a.left,d)||ancestor_and_descendent(a.right,d);
}
public void go(TreeNode root){
if(ancestor_and_descendent(root,p)&&ancestor_and_descendent(root,q)){ //本结点是共祖
if(ancestor_and_descendent(root.left,p)&&ancestor_and_descendent(root.left,q))go(root.left); //左结点是共祖
else if(ancestor_and_descendent(root.right,p)&&ancestor_and_descendent(root.right,q))go(root.right); //右结点是共祖
else answer=root; //左右结点都不是共祖;既然自己是共祖,那肯定就是最近的共祖了!注:左结点是共祖和右结点是共祖互斥!
}
}
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
this.p=p;
this.q=q;
go(root);
return answer;
}
}
Java代码二:
class Solution { //所有节点的值都是唯一的。 p、q 为不同节点且均存在于给定的二叉搜索树中。
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { //二叉搜索树:左小右大
if(p.val<root.val&&q.val<root.val)return lowestCommonAncestor(root.left,p,q); //都在左
if(p.val>root.val&&q.val>root.val)return lowestCommonAncestor(root.right,p,q); //都在右
return root; //p、q分居root两侧;p是q的祖先;q是p的祖先
}
}