将一棵无穷大满二叉树的结点按根结点一层一层地从左往右编号,根结点编号为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;
}
};