[笔试编程]2017.8.29腾讯模拟,满二叉排序树找最小子树

本文介绍了一种在满二叉排序树中寻找特定数值的高效算法。通过递归分治的方法,在给定树的高度和三个目标数值的情况下,确定这三个数值共同子树的根节点。该算法首先检查中间节点是否为目标数之一,然后根据目标数的位置决定搜索方向。

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

题目

满二叉树排序树,高度k,节点数2^k-1,节点值1~2^k-1,给定3个数,求包含这3个数的最小子树的根节点。

输入4个数组,第一个值为高度,后面3个值为目标数。

例:
输入
4 10 15 13
输出
12

思路
分治
1. 判断中间数是否包含在要找的数里面,包含则中间数是所求
2. 判断目标数是否全在左/右半,是则继续找左/右半。
3. 不全在左/右半,则中间数为所求。

#include <iostream>
#include <algorithm>
#include <vector>
/*
满二叉排序数,层数k,节点数2^n-1, 1~2^n-1

4 10 15 13
*/

using namespace std;

int div(int left, int right, vector<int> &target)
{
    int mid = (left + right) / 2;

    if (find(target.begin(), target.end(), mid) != target.end()) {
        return mid;
    }
    else if (*(target.end() - 1) < mid) {
        return div(left, mid - 1, target);
    }
    else if (target[0] > mid) {
        return div(mid + 1, right, target);
    }
    else {
        return mid;
    }
}

int main()
{
    int k;
    vector<int> target_nums(3);
    cin >> k >> target_nums[0] >> target_nums[1] >> target_nums[2];

    sort(target_nums.begin(), target_nums.end());

    int l = 1;
    int r = powl(2,k) - 1;
    int res = div(l, r, target_nums);

    cout << res << endl;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值