二元查找树(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<Integer> stack1 = getPath(index1, tree);Stack<Integer> 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<Integer> getPath(int index, int[] tree) {Stack<Integer> stack = new Stack<>();while (index / 2 != 0) {stack.push(tree[index]);index = index / 2;}stack.push(tree[1]);return stack;}
}

2020年奇安信校招JAVA岗笔试相关推荐

  1. 背包问题 2020年小米校招JAVA岗笔试第二题

    对于背包问题:例如小偷东西问题 如上图 小偷最多可以带走重量位20.要尽可能带走多的商品. 所以应该设置数组capacity[20+1], 商品itmes [5+1] 其中,capacity[0]=0 ...

  2. 2020年旷世校招JAVA岗笔试第二题

    字符串长度 题目描述: 给定一个只包含小写英文字母的字符串以及一个常数 k,求字符串最长的包含不超过 k 种字母的子串的长度. 例如,给定字符串 abaabccbbbdddddda,k = 3,这时 ...

  3. 2020年旷世校招JAVA岗笔试第一题

    1的个数 题目描述: 给定非负整数n,输出它的二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1.因此,如果n=9,则输出2. 输入 一行非负整数n,n最大不超过32位有符号整数的最大 ...

  4. 2020年快手校招JAVA岗笔试第三题

    题目描述: 将两个内容合并,每次,取第一行四个,取第二行5个.把多余的直接补在最后即可. 解题代码 import java.util.Scanner;public class Main_3 {publ ...

  5. 2020年快手校招JAVA岗笔试第二题

    解题代码 import java.util.HashSet; import java.util.Scanner; import java.util.Set;public class Main {pub ...

  6. 2020年快手校招JAVA岗笔试第一题

    解题办法: import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc ...

  7. 奇安信校招面试题来啦

    防范常见的 Web 攻击 一.什么是 SQL 注入攻击 攻击者在 HTTP 请求中注入恶意的 SQL 代码,服务器使用参数构建数据库 SQL 命令时,恶意SQL 被一起构造,并在数据库中执行. 用户登 ...

  8. 2020年小米校招JAVA岗笔试第二题

    题目描述: 小米之家有很多米粉喜欢的产品,产品种类很多,价格也不同.比如某签字笔1元,某充电宝79元,某电池1元,某电视1999元等 假设库存不限,小明去小米之家买东西,要用光N元预算的钱,请问他最少 ...

  9. 用友2020校招java笔试题_2020年快手校招JAVA岗笔试第三题-Go语言中文社区

    题目描述: 将两个内容合并,每次,取第一行四个,取第二行5个.把多余的直接补在最后即可. 解题代码 import java.util.Scanner; public class Main_3 { pu ...

最新文章

  1. [导入]Java线程的深入探讨
  2. 3创建型模式之单例模式
  3. PL/Sql Dev 调试Oracle存储过程、触发器、函数
  4. Table options do not contain an option key ‘connector‘ for discovering a connector
  5. 问题:使用jdk11 报错:java.lang.TypeNotPresentException: Type javax.xml.bind.JAXBContext not present
  6. vue 双向数据绑定
  7. 实习成长之路:设计模式一:为什么你明明使用面向对象设计语言总写面向过程的程序?
  8. 浅谈 JNIEnv 和 JavaVM
  9. 2018 蓝桥杯 C++ A组 1-7
  10. 我的第一本书《FFmpeg音视频开发基础与实战》已正式出版
  11. python繁简体转换
  12. 数组排序 向大佬低头 时间算法
  13. 微信小程序使用函数的三种方法
  14. 效率最高的两种项目沟通方式
  15. 陈绮贞 《吉他手》 吉他谱子 图片+文字
  16. Portainer的下载与安装
  17. 【微信小程序】一文带你吃透小程序开发框架——视图层中的事件系统
  18. 天融信AlphaFuzzer测试工具 使用教程
  19. 100人局域网(企业)至少需要多少带宽?
  20. Android 录音实现(AudioRecord)

热门文章

  1. C语言fputs()函数(把字符串写入到指定的流 stream (文件指针)中)
  2. Intel Realsense D435 报错 Couldn't resolve requests
  3. tensorflow教程 开始——Premade Estimators(预制评估器)
  4. python 面向对象的篮球技巧训练实现
  5. pycharm Enable Live Templates的作用
  6. 绝命沙虫 精度,double,模拟 牛客白月赛44
  7. js动态生产html元素,js 动态创建 html元素
  8. Java动态代理详解(Proxy+InvocationHandler)
  9. HIve学习:Hive分区修改
  10. spring boot 微服务集群 + 注册中心