$\large\leftarrow$ 如果这篇题解对你有帮助就点个赞嘛~
完全二叉树的性质:
第 $i$ 层有 $2^{i-1}$ 个节点;
通过观察还可以发现,第 $i$ 层的第一个节点也是编号为 $2^{i-1}$ 的节点(这个不太算性质了吧很容易发现)。
因为输入是层次遍历,同一层的节点一定是连续的,所以第 $i$ 层的节点范围就是 $[2^{i-1},\min\{2^i,n + 1\})$。
最后一层比较特殊(不一定是满的),所以要取个 $\min$。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n, k;
int a[1005];
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
cin >> k;
bool ok = false;
for (int i = 1 << (k - 1); i < min(1 << k, n + 1); i ++ )
cout << a[i] << ' ', ok = true;
if (!ok) puts("EMPTY");
return 0;
}
草是 $\min$ 改过来了