将一棵无穷大满二叉树的结点按根结点一层一层地从左往右编号,根结点编号为1。现给定a,b为两个结点。设计一个算法,返回a、b最近的公共祖先的编号。注意其祖先也可能是结点本身。
测试样例:
2,3
返回:1
import java.util.*;
public class LCA {
public int getLCA(int a, int b) {
// write code here
List<Integer> list = new ArrayList<>();
while(a != 0){
list.add(a);
a/=2;
}
while(b != 0){
if(list.contains(b))
return b;
b/=2;
}
return 1;
}
} 没有使用递归,用 list + 两次循环 。简单处理import java.util.*;
public class LCA {
public int getLCA(int a, int b) {
// write code here
/*
1
2 3
4 5 6 7
*/
Op op = new Op();
op.getParent(a,b);
return op.parent;
}
static class Op{
int parent = -1;
void getParent(int nodea,int nodeb) {
while(nodea!=nodeb) {
if(nodea> nodeb) {
nodea>>=1;
}else{
nodeb>>=1;
}
}
parent = nodea;
}
}
} import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class LCA {
public static int getLCA(int a, int b) {
// write code here
List<Integer> lista = new ArrayList<>();
List<Integer> listb = new ArrayList<>();
lista.add(a);
listb.add(b);
judge(a,lista );
judge(b,listb );
for(int a1:lista){
for (int b1:listb){
if(a1==b1){
return a1;
}
}
}
return 0;
}
public static void judge(int num,List<Integer> list){
while(num>1){
if(num%2==0) {
num = num / 2;
list.add(num);
}else {
num = (num-1)/2;
list.add(num);
}
}
}
} //思路:节点n的左子节点是2n,右子节点是2n+1的特性。先让a和b处于同一层,然后向上找父节点
//
public int getLCA(int a, int b) {
// write code here
if (a == b)
return a;
if (a > b) {
int temp = a;
a = b;
b = temp;
}
// 保证a<b
int aLayer = (int) (Math.log(a) / Math.log(2));
int bLayer = (int) (Math.log(b) / Math.log(2));
// 使a,b在同一层
while (bLayer > aLayer) {
if (b % 2 == 1) {
b = b - 1;
}
b = b / 2;
bLayer--;
}
int aParent = a,bParent =b;
while(aParent!=bParent){
if(aParent%2==1)
aParent --;
if(bParent%2==1)
bParent --;
aParent /=2;
bParent /=2;
}
return aParent;
} //方法一:开始看到这一题觉得递归搜索吧,这递归不好写啊,一看输入没有树,难道是找规律?画个图观察了一下,还真有规律。。QAQ,我是菜鸟我怕谁
public int getLCA(int a, int b) {
if(a==b) return a;
while(a!=b){
a=a>b?a>>1:a;
b=b>a?b>>1:b;
}
return a;
}
//方法二:最近在学习递归,所以。。。。
public int getLCA(int a, int b) {
return a==b?b:a>b?getLCA(a>>1,b):getLCA(a,b>>1);
}
public:
int getLCA(int a, int b) {
// write code here
while(a != b)
{
if(a > b)
a /= 2;
else
b /= 2;
}
return a;
}
};