求两个节点的最近祖先:
思路1:如果一个节点是最近祖先的话,那么这两个节点,必须分布在该节点的左右子树上。
思路2:非递归后序遍历,分别找到根节点到两个节点的路径,求出最近祖先。
根据思路二写出
//求从根节点到指定节点之间的路径
public void Route(Node node,Arraylist<Node> arraylist){
Stack<Node> stack=new Stack<Node>();
Node p=head;
Node pre=p;
while(p!=null||!stack.isEmpty()){
while(p!=null){
stack.push(p);
p=p.left;
}
p=stack.peek().right;
if(p==null||p==pre){
if(stack.peek().data==node){
break;
}
else{
p=stack.pop();
pre=p;
p=null;
}
}
}
for(Node n:stack){
arraylist.add(n);
}
}
public Node find(Node node1,Node node2){
ArrayList<Node> arraylist1=new ArrayList<Node>();
ArrayList<Node> arraylist2=new ArrayList<Node>();
Route(node1,arraylist1);
Route(node2,arraylist2);
int n=Math.min(arraylist1.size(),arraylist2.size());
for(int i=0;i<n;i++){
if(arraylist1.get(i)!=arraylist1.get(i)){
return arraylist1.get(i-1);
}
}
}