/*
原理:完全二叉树每一层第一个节点的编号为2的正整数次幂
如:
第一层第一个:1
第二层第一个:2
第三层第一个:4
第四层第一个:1
如果不是最后一层,算出该层有多少个数,,则按序输出
若为最后一行,先算最后一行有多少个,再按序输出
*/
#include<iostream>
#include<cmath>
using namespace std;
bool lastLayer(int n, int d)
{
//一共n个结点,判断第d层是否为最后一层
//log2(d)=log(d)/log(2) ,以2为底n的对数
int total = log(n) / log(2) + 1;//一共多少层
if(d==n)
{
return true;
}
return false;
}
int main()
{
int n;
int a[1001] ;//最多1000个结点
int d;//要查找的深度
cin>>n;
//将结点按照层序放入数组中,数组a[0]不用
for(int i=1; i<=n; i++)
{
cin>>a[i];
}
cin>>d;
int total = log(n) / log(2) + 1;//一共多少层
if(d>total)
{
cout<<"EMPTY"<<endl;
}
else if(!lastLayer(n, d)) //自定义函数lastLayer();
{
//要查找的层最多有多少个(满二叉树)
int d_num = pow(2, (d-1));
//当前层的第一个数 = 当前层结点的个数
int first = d_num;
//如果不是最后一层
for(int i=0; i<d_num; i++)
{
cout<<a[first+i]<<" ";
}
}
else
{
//是最后一层
//最后一层个数为 总个数n - 之前所有层个数
int d_num = n - (pow(2,(d-1)) -1);
int first = pow(2,(d-1));
for(int i=0; i<d_num; i++)
{
cout<<a[first+i];
}
}
return 0;
}
#include <stdio.h>
#include <math.h>
#include <string.h>
#define maxn 1010
int node[maxn];
int n, d;
int main() {
while (scanf("%d", &n) != EOF) {
memset(node, 0, sizeof(node));
for (int i = 1; i <= n; i++) {
scanf("%d", &node[i]);
}
scanf("%d", &d);
int i = pow(2, d - 1);
if (i <= n) {
for (; i <= n && i < pow(2, d); i++) {
printf("%d", node[i]);
printf("%s", i != n " " : "\n");
}
} else {
printf("EMPTY\n");
}
}
return 0;
}
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
typedef struct _node
{
int data;
int layer;
struct _node *lchild;
struct _node *rchild;
}node;
node *newNode(int x)
{
node *root = new node;
root->data = x;
root->layer = 1;
root->lchild = root ->rchild = NULL;
return root;
}
int n, d, num[1010];
vector<int> v;
void create(node *&root, int index)
{
if (index > n)
return;
root = newNode(num[index]);
create(root->lchild, 2 * index);
create(root->rchild, 2 * index + 1);
}
void bfs(node *root, int d)
{
queue<node *> q;
q.push(root);
while(!q.empty())
{
node *now = q.front();
q.pop();
if (now->layer == d)
v.push_back(now->data);
if (now->lchild)
{
now->lchild->layer = now->layer + 1;
q.push(now->lchild);
}
if (now->rchild)
{
now->rchild->layer = now->layer + 1;
q.push(now->rchild);
}
}
}
int main()
{
while (scanf("%d", &n) != EOF)
{
for (int i = 1; i <= n; i++)
{
scanf("%d", &num[i]);
}
scanf("%d", &d);
node *root = NULL;
create(root, 1);
bfs(root, d);
for (auto it = v.begin(); it != v.end(); ++it)
{
printf("%d%s", *it, it != v.end() - 1 ? " " : "\n" );
}
if (v.empty())
printf("EMPTY\n");
}
return 0;
}
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
// 理解树的特征:
// 完全二叉树的节点个数 <= 2^h-1;
// 每一层的节点数为2^(h-1);
// 若层次遍历存放在已0开头的数组中,第h层的开始节点下标为2^(h-1)-1,结束节点下标为2^(h)-2
int main(void)
{
int n;
vector<int> a;
while(cin >> n)
{
a.clear();
for(int i = 0;i < n;i++)
{
int x;
cin >> x;
a.push_back(x);
}
int d;
cin >> d;
if(d == 1)
{
cout << a[0] << endl;
break;
}
int first = pow(2,d - 1) - 1;//第d层的开始结点,减一是因为下标从0开始的
int end = pow(2,d) - 2;//第d层的结束结点,减2是因为下标从0开始的,原本是减1
if(first > n)//开始结点已然超过树本身所拥有的结点总数
{
cout << "EMPTY" << endl;
break;
}
else
{
end = (end < (n - 1)) ? end : (n - 1);//判断结束结点是不是在最后一层,防止访问越界
for(int i = first;i <= end;i++)
{
cout << a[i];
if(i != end)
cout << ' ';
}
}
}
return 0;
} //建立一个二维数组 第一层1个数据 第二层两个数据2的1次方....
#include<stdio.h>
(737)#include<math.h>
int main()
{
int n,d,a[100],b[100][100];
scanf("%d",&n);
int i,j,k;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
b[1][0]=a[0];//第一行一个数
k=1;//数组a的下标
for(i=2;i<=(log2(n)+1);i++)//深度从第二层开始
{
for(j=0;j<pow(2,i-1)&&k<n;j++)//k<n代表不要超过总数,完全二叉树
{
b[i][j]=a[k];
k++;
}
}
scanf("%d",&d);
if(d>(log2(n)+1))
printf("EMPTY");
else{
for(j=0;b[d][j]!=NULL;j++)
printf("%d ",b[d][j]);
}
} import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
int n = scanner.nextInt();
int[] nodes= new int[n];
for (int i = 0; i < n ;i++) nodes[i] = scanner.nextInt();
int d = scanner.nextInt();
int start = (int) Math.pow(2,d-1)-1;
if (start>=n){
System.out.println("EMPTY");
continue;
}
int len = (int)Math.pow(2,d-1);
for (int i = start; i <start+len ; i++) System.out.print(nodes[i]+" ");
System.out.println();
}
}
} #include <cmath>
#include <iostream>
using namespace std;
int main()
{
int n,d;
int a[1001];
cin >> n;
for (int i = 1; i <= n; ++i)
{
cin >> a[i];
}
cin >> d;
int iBeg = pow(2,d-1);
int iEnd = pow(2,d) - 1;
if(iBeg > n)
{
cout << "EMPTY" << endl;
}
else
{
iEnd = (iEnd > n) ? n : iEnd;
for(int i = iBeg; i <= iEnd; ++i)
{
cout << a[i];
if(i != iEnd)
cout << ' ';
}
}
return 0;
}
#include<iostream>
using namespace std;
int mi(int x)//求2的x次幂
{
if (x == 0)
return 1;
else
return 2 * mi(x - 1);
}
int main()
{
int a[1000], n,m,sum=0;
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
cin >> m;
for (int i = 0; i < m-1; i++)
sum += mi(i);//求深度为d之前的个数
if (n <= sum)
{
cout << "EMPTY" << endl;
return 0;
}
for (int j = sum; j < n&&j < sum + mi(m-1); j++)//输出深度为d的
{
if (j == n -1|| j == (sum + mi(m-1)-1))
cout << a[j] << endl;
else
cout << a[j] << " ";
}
return 0;
}
#include <cstdio>
#include <cmath>
const int N = 1000;
int main()
{
int tree[N], n, d;
while (scanf("%d", &n) != EOF)
{
for (int i = 0; i < n; i++)
{
scanf("%d", &tree[i]);
}
scanf("%d", &d);
int start = (int)pow(2, d - 1);
if (start > n)
{
printf("EMPTY\n");
}
else
{
int end = pow(2, d) - 1 > n ? n : (int)pow(2, d) - 1;
for (int i = start - 1; i < end - 1; i++)
{
printf("%d ", tree[i]);
}
printf("%d\n", tree[end - 1]);
}
}
return 0;
}
#include <string.h> #include <iostream> #include <algorithm> #include <valarray> using namespace std; int main() { int n; scanf("%d", &n); int arr[n+1]; for (int i = 1; i <= n; ++i) { scanf("%d", &arr[i]); } int c; scanf("%d",&c); if (n <= pow(2, c - 1) - 1) { printf("EMPTY"); } else { int j; if(n<pow(2,c)-1) { j = n; } else { j = pow(2,c)-1; } for (int i = pow(2, c - 1); i <= j; ++i) { printf("%d ", arr[i]); } } }
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
int n = scanner.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = scanner.nextInt();
}
int d = scanner.nextInt();
if ( n >= Math.pow(2, d)-1) {
//树的层数至少有d+1
for (int i = (int)Math.pow(2, d-1)-1; i < Math.pow(2, d)-1 ; i++) {
System.out.print(arr[i] + " ");
}
}else if (n >= Math.pow(2, d-1) && n < Math.pow(2, d)-1) {
//树的层数为d
for (int i = (int)Math.pow(2, d-1)-1; i < n; i++) {
System.out.print(arr[i]+" ");
}
}else {
//树的层数小于d
System.out.println("EMPTY");
}
}
}
}
#include<stdio.h>
#include<math.h>
#include<vector>
using namespace std;
int main(){
int N;
int tmp;
scanf("%d",&N);
vector<int> vec;
vec.push_back(-1);
for(int i=0;i<N;i++){
scanf("%d",&tmp);
vec.push_back(tmp);
}
int M;
scanf("%d",&M);
int pos = pow(2,M-1);
if(pos>vec.size()){ printf("EMPTY"); return 0;}
for(int i=pos;i<2*pos;i++){
if(i>vec.size()) return 0;
printf("%d ",vec[i]);
}
} #include <algorithm>
#include <cmath>
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
while (cin >> n) {
vector<int>tree(n + 1); //树结点值
//1号单元为根结点,0号单元未用
for (int i = 1; i <= n; i++) {
cin >> tree[i];
}
int d;
cin >> d;
int start = pow(2, d - 1); //起始结点编号
if (start > n) {
cout << "EMPTY" << endl;
} else {
int end = min(n, (int)pow(2, d) - 1); //终止结点编号
for (int i = start; i <= end; i++) {
cout << tree[i];
i == end ? cout << endl : cout << " ";
}
}
}
return 0;
} #include <cstdio>
#include <iostream>
using namespace std;
int main() {
int n, d;
int a[1010];
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
scanf("%d", &d);
int b = 1;
for (int i = 1; i < d; i++) {
b *= 2;
}
b -= 1;
int e = 2 * b;
if (n <= e)e = n;
for (int i = b; i <= e; i++) {
printf("%d", a[i]);
if (i != e)printf(" ");
}
if (b > n) {
printf("EMPTY");
}
}
} #include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int main() {
int n, d;
while (cin >> n){
vector<int> va(n);
for (int& i : va) cin >> i;
cin >> d;
int i = (int)pow(2, d - 1) - 1;
if (i >= n){
cout << "EMPTY" << endl;
continue;
}
int j = (int)pow(2, d) - 2;
if (j >= n) j = n - 1;
while (i < j){
cout << va[i] << " ";
++i;
}
cout << va[j] << endl;
}
} #include<iostream>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
int n;
int v[1000];
cin >> n;
for(int i = 0;i < n;i++)
cin >> v[i];
int d;
cin >> d;
int index = -1;
for(int i = 0;i < d;i++)
index += pow(2, i);
int start = index - pow(2, d - 1) + 1;
if(start >= n) cout << "EMPTY" << endl;
else{
index = min(index, n - 1);
for(int i = start; i <= index;i++)
cout << v[i] << " ";
cout << endl;
}
} #include<iostream>
#include<cmath>
const int N=1005;
int tree[N];
int main() {
int n,d;
while(scanf("%d",&n)!=EOF) {
for(int i=1;i<=n;i++) {
scanf("%d",&tree[i]);
}
scanf("%d",&d);
int st=(int)pow(2,d-1);
if(st>n){
printf("EMPTY\n");
}
else {
int en=pow(2,d)-1>n? n : (int)pow(2,d)-1;
for(int i=st;i<=en;i++) {
printf("%d ",tree[i]);
}
printf("\n");
}
}
}