【算法真题 一】满二叉搜索树求三个节点的最低公共祖先

简介: 【算法真题 一】满二叉搜索树求三个节点的最低公共祖先

昨天腾讯的模拟考编程题,当时一脸懵逼。。。。

##题目描述

对于一棵满二叉搜索树深度为K,节点数为2^k - 1,节点值为[1, 2^k - 1]。给出k和任意三个节点的值,输出包含该三个节点的最小子树的根节点值。

输入: 4 10 15 13

输出:12

##解题思路

依据二叉搜索树的特殊性质和满二叉树的特殊性质,可用二分查找的方式

网络异常,图片无法展示
|

##代码实现

package 腾讯;
import java.util.Scanner;
public class Main {
  public static int binarySearch(int a, int b, int c, int left, int right) {
    int m = (left + right) / 2;
    if ((a - m) * (b - m) <= 0 || (a - m) * (c - m) <= 0 || (c - m) * (b - m) <= 0) {    //如果三个数不都在同一侧
      return m;
    } else if (a > m) { //如果在同一侧且都在右侧
      return binarySearch(a, b, c, m + 1, right);
    } else {  //如果在同一侧且都在左侧
      return binarySearch(a, b, c, left, m - 1);
    }
  }
  public static void main(String[] args) {
    @SuppressWarnings("resource")
    Scanner sc = new Scanner(System.in);
    int k = sc.nextInt();
    int a = sc.nextInt();
    int b = sc.nextInt();
    int c = sc.nextInt();
    System.out.println(binarySearch(a, b, c, 1, (1 << k) - 1));
  }
}


相关文章
|
2天前
|
算法
【优选算法专栏】专题九:链表--------两两交换链表中的节点
【优选算法专栏】专题九:链表--------两两交换链表中的节点
18 0
|
2天前
|
NoSQL 算法 安全
Redlock 算法-主从redis分布式锁主节点宕机锁丢失的问题
Redlock 算法-主从redis分布式锁主节点宕机锁丢失的问题
167 0
|
2天前
|
算法 Java
算法:Java计算二叉树从根节点到叶子结点的最大路径和
算法:Java计算二叉树从根节点到叶子结点的最大路径和
|
2天前
|
算法 vr&ar 图形学
☆打卡算法☆LeetCode 222. 完全二叉树的节点个数 算法解析
☆打卡算法☆LeetCode 222. 完全二叉树的节点个数 算法解析
|
2天前
|
算法 程序员
【算法训练-链表 六】【链表查找】:链表中倒数第k个节点
【算法训练-链表 六】【链表查找】:链表中倒数第k个节点
27 0
|
2天前
|
存储 JavaScript 算法
TypeScript算法专题 - blog4 - 单链表节点的两-两翻转(两两一组逆序)
TypeScript算法专题 - blog4 - 单链表节点的两-两翻转(两两一组逆序)
30 0
|
2天前
|
算法 Java 程序员
【算法训练-二叉树 五】【最近公共祖先】二叉树的最近公共祖先、二叉搜索树的最近公共祖先
【算法训练-二叉树 五】【最近公共祖先】二叉树的最近公共祖先、二叉搜索树的最近公共祖先
46 0
|
2天前
|
机器学习/深度学习 算法 测试技术
【动态规划】【C++算法】1335 工作计划的最低难度
【动态规划】【C++算法】1335 工作计划的最低难度
|
2天前
|
算法 测试技术 C++
【大根堆】【C++算法】871 最低加油次数
【大根堆】【C++算法】871 最低加油次数
|
2天前
|
JavaScript 算法 C语言
TypeScript算法专题 - blog5 - 单链表节点的`任意k个分组反转`的实现
TypeScript算法专题 - blog5 - 单链表节点的`任意k个分组反转`的实现
24 1