2020奇安信秋招Java笔试第二题---公共祖先

今天晚上做了奇安信的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

你可能感兴趣的:(秋招题解,java,数据结构)