3471. 二叉树

3471. 二叉树

⭐️难度:简单

⭐️类型:树

📖题目:题目链接

如上所示,由正整数 1,2,3......组成了一颗特殊二叉树。

我们已知这个二叉树的最后一个结点是 n。

现在的问题是,结点 m所在的子树中一共包括多少个结点。

比如,n=12,m=3,那么上图中的结点 13,14,15以及后面的结点都是不存在的,结点 m所在子树中包括的结点有 3,6,7,12,因此结点 m的所在子树中共有 4个结点。

输入格式

输入数据包括多行,每行给出一组测试数据,包括两个整数 m,n。

最后一行 0 0 表示输入结束。

输出格式

对于每一组测试数据,输出一行,该行包含一个整数,给出结点 m

所在子树中包括的结点的数目。

数据范围

1≤m≤n≤109,

最多包含 20组数据。

输入样例:

3 12

0 0

输出样例:

4

🌟思路:

📚题解:

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
using namespace std;

int main() {
    int m, n;
    while (1) {
        scanf("%d%d", &m, &n);
        if (m == 0 && n == 0) {
            break;
        }

        int i = 1; // 获取层数 从1开始
        int begin_level; // 存储子树的根在第几层
        int final_level; // 大树总共有几层
        // 2^(i-1) ~ 2^i-1
        // 1 << i ==> 2^i
        while (1) {
            if (m >= 1 << (i - 1) && m < 1 << i) {
                begin_level = i;
            }
            if (n >= 1 << (i - 1) && n < 1 << i) {
                final_level = i;
                break;
            }
            ++i;
        }
        int left_side = m;
        int right_side = m;
        for (i = begin_level; i < final_level; ++i) {
            left_side = 2 * left_side;
            right_side = 2 * right_side + 1;
        }

        int treeNum;
        // left_side > n 说明 实际的最左最右孩子在倒数第2层
        // 子树 是一颗 从 begin_level ~ final_level-1 满二叉树
        if (left_side > n) {
            treeNum = (1 << (final_level - begin_level)) - 1;
        }
        else if (n <= right_side) {
            treeNum = (1 << (final_level - begin_level)) - 1;
            treeNum += n - left_side + 1;
        }
        else {
            treeNum = (1 << (final_level - begin_level + 1)) - 1;
        }
        printf("%d\n", treeNum);
    }
    return 0;
}
相关推荐
吞下星星的少年·-·6 小时前
The 2026 ICPC Asia East Continent Online Contest (II)(构造)
数据结构·算法
Msshu1239 小时前
2~5串锂电快充优选|XSP36 Type‑C升压/升降压快充管理芯片
数据结构·随机森林·贪心算法·排序算法·线性回归·启发式算法
动词ing12 小时前
【学习笔记】数据结构栈与队列(栈先进后出+队列先进先出+括号匹配+消消乐模型)
数据结构·笔记·学习
a1879272183112 小时前
【算法】链表(二):链表上的双指针——变速、异链与定距,和一份路程账本
数据结构·算法·leetcode·链表·go·指针·环形链表
zcmodeltech14 小时前
火电厂模型能演示冷态启动和故障处理吗?——基于STM32与Modbus RTU的集控实训控制系统设计
数据结构·stm32·单片机·嵌入式硬件·能源
Doubbbbbbble云14 小时前
区间合并问题的常见算法模式与优化思路4
java·数据结构·算法
David猪大卫14 小时前
【C++修炼】哈希表的实现
数据结构·c++·笔记·学习·算法·哈希算法·散列表
linx29516 小时前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法
布莱克60516 小时前
C++ 七大排序算法详解:选择、冒泡、插入、计数、堆、快速与归并排序
数据结构·c++·算法·排序算法
科学实验家17 小时前
最小生成树:Prim,kruskal
数据结构·c++·算法