2017/8/29 腾讯测试开发工程师模拟笔试题

本文介绍了一种算法,该算法可以根据给定的满二叉排序树深度和三个节点值,找出包含这三个节点的最小子树的根节点值。通过对根节点值的不断调整,最终确定目标节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A、对于一颗满二叉排序树深度为K,节点数是2^K-1;节点值为1至2^K-1。给出K和任意三个节点的值,输出包含该三个节点的最小子树的根节点值
B、满二叉排序树的中序是一个有序的序列 即左子树都比根节点小,右子树都比根节点大 根节点为左节点与右节点值和的一半
C、样例输入:4 10 15 13
D、样例输出:12

#code=utf-8
import sys
import math

if __name__=="__main__":
    myList=list(map(int,sys.stdin.readline().strip().split()))
#保存任意输入的三个节点值
    node1=myList[1]
    node2=myList[2]
    node3=myList[3]
#根节点为左节点与右节点值和的一半
    root=math.pow(2,myList[0])/2.0
    leftNode=1 #初始化左节点为最小1
    rightNode=math.pow(2,myList[0])-1  #初始化2^k-1节点数
    for i in range(myList[0]):          #遍历深度K次数
        #给出的三个节点数都比根节点值小,则说明都在左子树,更新右节点数值和根节点值
        if(node1<root) and (node2<root) and (node3<root):
            rightNode=root-1
            root=(rightNode+leftNode)/2
        #给出的三个节点数都比根节点值大,则说明都在右子树,更新左节点数值和根节点值
        elif(node1>root) and (node2>root) and (node3>root):
            leftNode=root+1
            root=(rightNode+leftNode)/2
        #给出的三个节点数至少有一个比根节点值小,至少有一个比根节点大,则说明此根节点值为该三个节点的最小子树的根节点值
        else:
            print int(root)
            break

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值