二叉树最大结点个数和层数的关系
有一棵二叉树, 最大深度为D, 且所有叶子的深度都相同。 所有结点从上到下从左到右编号为1, 2, 3,…, 2D-1。 在结点1处放一个小球, 它会往下落。 每个内结点上都有一个开关,初始全部关闭, 当每次有小球落到一个开关上时, 状态都会改变。 当小球到达一个内结点时, 如果该结点上的开关关闭, 则往左走, 否则往右走, 直到走到叶子结点, 如图所示。

一些小球从结点1处依次开始下落, 最后一个小球将会落到哪里呢? 输入叶子深度D和小球个数I, 输出第I个小球最后所在的叶子编号。 假设I不超过整棵树的叶子个数。 D≤20。
输入最多包含1000组数据。
样例输入:
4 2
3 4
10 1
2 2
8 128
16 12345
样例输出:
127 5
12
3 2
55
36358
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main() {
int D, I;
while (scanf("%d %d", &D, &I) == 2) {
int k = 1;
for (int i = 0; i < D - 1; i++) {
if (I % 2) {
k = k * 2;
I = (I + 1) / 2;
}
else {
k = k * 2 + 1;
I /= 2;
}
}
printf("%d\n", k);// 出界之前的结点编号
}
return 0;
}
UVa 679的核心算法
&spm=1001.2101.3001.5002&articleId=104349643&d=1&t=3&u=da392f9612624058a70af87e73fc569f)
2475

被折叠的 条评论
为什么被折叠?



