您的位置:首页 > 其它

给出一棵二叉树的根节点和其中两个不同的节点求出它们最近的公共祖先节点

2015-08-01 15:28 447 查看
如题,这是一个很老的问题,我们采用类似后序遍历的方式,在找到一个节点后保存栈中的节点,已得到一条从根节点到当前节点的路径

代码如下

/**
* 给出一棵二叉树的根节点以及其他两个不同节点,返回这两个不同节点的最近公共祖先节点
* @param n1,n2,root
*/
public static void getClosetAncestor(BTNode root,int n1,int n2){
BTNode[] st=new BTNode[255];
BTNode p=root;
int k=0;
int flag=0;
BTNode pre=null;
BTNode[] st1=new BTNode[255];//用来存放n1节点的祖先节点
int k1=0;
BTNode[] st2=new BTNode[255];//用来存放n2节点的祖先节点
int k2=0;
if(p!=null){
st[k++]=p;
p=p.getLeft();
while(k>0){
while(p!=null){
st[k++]=p;
p=p.getLeft();
}
flag=1;
pre=null;
while(flag==1&&k>0){
p=st[k-1];
if(p.getRight()==pre){
k--;
if(p.getData()==n1){
for(int i=0;i<k;i++){
st1[k1++]=st[i];
}
}
if(p.getData()==n2){
for(int i=0;i<k;i++){
st2[k2++]=st[i];
}
}
pre=p;
}
else{
p=p.getRight();
flag=0;
}

}
}
}
int t=0;
while(t<k1-1&&t<k2-1){
if((st1[t].getData()==st2[t].getData())&&(st1[t+1].getData()==st2[t+1].getData()))
t++;
else
break;
}
System.out.println(st1[t].getData());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: