2020年奇安信校招JAVA岗笔试

2020年奇安信校招JAVA岗笔试_第1张图片

二元查找树(1.若左子树不空,左子树值都小于父节点;2.如右子树不空,右子树值都大于父节点;3.左、右子树都是二元查找树;4. 没有键值相等的节点)上任意两个节点的值,请找出它们最近的公共祖先。

输入

三行,第一行为树层级,第二行为数节点(其中-1表示为空节点),第三行为需要查找祖先的两个数。

在例图中(虚线框没有真实节点,为了输入方便对应位置输-1)查找12和20的最近公共祖先输入为:

4

9 6 15 2 -1 12 25 -1 -1 -1 -1 -1 -1 20 37

12 20

输出

输出给出两个数在树上的最近公共祖先数值,如果没有公共祖先,输出-1;如果其中一个节点是另一个节点的祖先,输出这个祖先点(如例图中找15、20最近公共祖先,输出15);如果输入无效,输出-1。

样例输入

4

9 6 15 2 -1 12 25 -1 -1 -1 -1 -1 -1 20 37

12 20

样例输出

15

 解题代码


import java.util.Scanner;
import java.util.Stack;

public class Main {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        int high = in.nextInt();

        if (high == 0) {
            System.out.println(-1);
            return;
        }
        int numOfNode = (int) (Math.pow(2, high) - 1);
        int[] tree = new int[numOfNode + 1];
        for (int i = 1; i <= numOfNode; i++) {
            tree[i] = in.nextInt();
        }

        int n1 = in.nextInt();
        int n2 = in.nextInt();

        int index1 = 0;
        int index2 = 0;

        int count = 0;

        for (int i = 1; i <= numOfNode; i++) {

            if (n1 == tree[i]) {
                index1 = i;
                count++;
            }
            if (n2 == tree[i]) {
                index2 = i;
                count++;
            }

        }
        if (count != 2) {
            System.out.println(-1);
            return;
        }

        Stack stack1 = getPath(index1, tree);
        Stack stack2 = getPath(index2, tree);
        int res = -1;

        while (!stack1.isEmpty() && !stack2.isEmpty() && stack1.peek().equals(stack2.peek())) {

            res = stack1.pop();
            stack2.pop();
        }

        System.out.println(res);

    }

    private static Stack getPath(int index, int[] tree) {

        Stack stack = new Stack<>();
        while (index / 2 != 0) {

            stack.push(tree[index]);
            index = index / 2;

        }
        stack.push(tree[1]);
        return stack;

    }
}

 

你可能感兴趣的:(校园招聘)