给出一棵二叉树的根节点和其中两个不同的节点求出它们最近的公共祖先节点
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());
}
代码如下
/**
* 给出一棵二叉树的根节点以及其他两个不同节点,返回这两个不同节点的最近公共祖先节点
* @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());
}
相关文章推荐
- win8.1升级win10后只有edge浏览器能上网该怎么办?
- 逆波兰表达式求值(Evaluate Reverse Polish Notation)
- 剑指Offer面试题15(Java版):链表中倒数第K个结点
- 网络流Dinic模板
- [python]如何对字符串进行大小写转换
- win7旗舰版升级win10
- UVA 1451 Average平均值 (数形结合,斜率优化)
- Checker Challenge
- 简易计算器
- 【数据结构与算法】浅谈数据结构与算法
- 探索SQL的左连接等
- POJ 3416 Crossing
- 杭电2524 矩形A + B
- 黑马程序员—— 反射总结
- 图片压缩
- 对称加密算法AES------使用AES算法对文件进行加密/解密的操作(JAVA)
- 一元二次方程根
- APP_FIND的用法
- opendaylight Lithium编译和代码导入eclipse
- hdu1789doing homework again【贪心】