case1:普通二叉树找公共祖先
思想:
三种情况:
1、p q 一个在左子树 一个在右子树 那么当root即是最近公共祖先
2、p q 都在左子树
3、p q 都在右子树
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null) return root;
if(root==p||root==q){//若其中一个结点是根节点,则它们的最近公共祖先结点当然就是root了
return root;
}
TreeNode leftAncestor = lowestCommonAncestor(root.left,p,q);
TreeNode rightAncestor = lowestCommonAncestor(root.right,p,q);
if(leftAncestor!=null&&rightAncestor!=null){//说明p,q分别位于为左右子树所以他们的公共祖先结点应该为根节点root
return root;
}else if(leftAncestor!=null){
return leftAncestor;
}else if(rightAncestor!=null){
return rightAncestor;
}else{//两个都为null,则表示没有找到
return null;
}
}
}
case2:BST找公共祖先结点
还是那三种情况,只不过可以利用BST的特性进行减枝
1、p q 一个在左子树 一个在右子树 那么当root即是最近公共祖先
2、p q 都在左子树
3、p q 都在右子树
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null)return null;
if(root==p||root==q)return root;
if(root.val>p.val&&root.val>q.val){
return lowestCommonAncestor(root.left,p,q);
}
else if(root.val<p.val&&root.val<q.val){
return lowestCommonAncestor(root.right,p,q);
}
else{
return root;
}
}
}
case3:非递归实现
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null)return null;
if(root==p||root==q)return root;
while(root!=null){
if(root.val>p.val&&root.val>q.val){
root = root.left;
}
else if(root.val<p.val&&root.val<q.val){
root = root.right;
}
else{
return root;
}
}
return null;
}
}