今天晚上做了奇安信的Java开发在线笔试题,编程题一共两道,记录一下解答思路
第二题给的题目意思是给定一棵平衡二叉树,满二叉树(无子节点用-1补齐),输入第一个数为二叉树的层数,再输入一个数组为二叉树的节点值,再输入两个值表示给定的两个节点,要求找到这两个节点的最近公共祖先。
不用受题目影响强行用树。用数组保存,然后可以找到输入的数在数组中的下标。我们可以画一颗树观察一下发现,每个结点的下标除以2,得到其父节点下标(得到这个就行了)。
import java.util.Scanner;
/**
* Created by wsw on 2019/9/9 20:20
* 奇安信笔试第二题: 平衡二叉树节点的公共祖先
*
* 利用数组就可以解决
*/
public class Main {
public static void main(String[] args) {
//处理输入数据
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(); //树的层数
int len = (int) (Math.pow(2, n) - 1); //数的节点数
int[] nodes = new int[len]; //存储节点
scanner.nextLine();//换行
for (int i = 0; i < len; i++) {
nodes[i] = scanner.nextInt();
}
scanner.nextLine();
int node1 = scanner.nextInt();
int node2 = scanner.nextInt();
scanner.close();
//利用满二叉树的性质,借助数组下标关系实现
int index1 = -1;
int index2 = -1;
//找到两个目标节点在数组中的下标
for (int i = 0; i < len; i++) {
if (nodes[i] == node1)
index1 = i;
if (nodes[i] == node2)
index2 = i;
}
//目标节点不存在
if (index1 == -1 || index2 == -1){
System.out.println(-1);
}
//下标除以2找到最近的公共祖先
while (index1 != index2){
if (index1 > index2){
index1 = (index1 - 1) / 2;
}else {
index2 = (index2 - 1) / 2;
}
}
System.out.println(nodes[index1]);
}
}
测试结果:
4
9 6 15 2 -1 12 25 -1 -1 -1 -1 -1 -1 20 31
12 20
15
Process finished with exit code 0