package leetcode;
import java.util.ArrayList;
import java.util.List;
public class offer_68_2 {
//判断是否找出p和q
boolean flag1=false;
boolean flag2=false;
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
//l1存放p的路径
List<TreeNode> l1=new ArrayList<TreeNode>();
//l1存放q的路径
List<TreeNode> l2=new ArrayList<TreeNode>();
//从后往前找出两个链表之前的相同元素
backtrack(root, l1, l2, p, q);
int i=l2.size()-1;
for(;i>=0;i--) {
if(l1.contains(l2.get(i))) {
return l2.get(i);
}
}
return root;
}
public void backtrack(TreeNode root,List<TreeNode> l1,List<TreeNode> l2,TreeNode p,TreeNode q) {
if(root==null) {return;}
if(root.val==p.val) {
l1.add(root);
flag1=true;
}
if(root.val==q.val) {
l2.add(root);
flag2=true;
}
if(flag1==true&&flag2==true) {
return;
}else {
if(flag1!=true) {
l1.add(root);
}
if(flag2!=true) {
l2.add(root);
}
backtrack(root.left, l1, l2, p, q);
backtrack(root.right, l1, l2, p, q);
if(flag1!=true) {
l1.remove(l1.size()-1);
}
if(flag2!=true) {
l2.remove(l2.size()-1);
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
offer_68_2 off=new offer_68_2();
TreeNode root=new TreeNode(3);
Integer[] a= {3,5,1,6,2,0,8,null,null,7,4,null,null,null,null};
root.CreateTree(root, a);
off.lowestCommonAncestor(root, new TreeNode(5), new TreeNode(7));
}
}