private class HelperType{
public TreeNode node;
public boolean a_exist,b_exist;
public HelperType(TreeNode n,boolean a,boolean b){
a_exist=a;
b_exist=b;
node=n;
}
}
public TreeNode lowestCommonAncestor3(TreeNode root, TreeNode A, TreeNode B) {
HelperType result=helper(root,A,B);
if(result.a_exist && result.b_exist){
return result.node;
}
else{
return null;
}
}
public HelperType helper(TreeNode root,TreeNode A,TreeNode B){
if(root==null){
return new HelperType(null,false,false);
}
HelperType left=helper(root.left,A,B);
HelperType right=helper(root.right,A,B);
//use root==A/B to judge whether there exist node
boolean aexist=left.a_exist || right.a_exist || root==A;
boolean bexist=left.b_exist || right.b_exist || root==B;
//LCAI and LCAII are combined with root==null
if(root==A || root==B){
return new HelperType(root,aexist,bexist);
}
//caution: left.node not left
if(left.node!=null && right.node!=null){
return new HelperType(root,aexist,bexist);
}
if(left.node!=null){
return new HelperType(left.node,aexist,bexist);
}
if(right.node!=null){
return new HelperType(right.node,aexist,bexist);
}
return new HelperType(null,aexist,bexist);
}