问题:
有一棵树,输出某一深度的所有节点,有则输出这些节点,无则输出EMPTY。该树是完全二叉树。
输入:
输入有多组数据。
每组输入一个n(1<=n<=1000),然后将树中的这n个节点依次输入,再输入一个d代表深度。
输出:
输出该树中第d层得所有节点,节点间用空格隔开,最后一个节点后没有空格。
例如:
5
1 2 3 4 5
7
7
1 2 3 4 5 6 7
2
0
输出:
EMPTY
2 3
分析:
因为是完全二叉树,采用数组不浪费空间,所以采用数组来做
获取完全二叉树的深度:(知道总节点的个数):
用代码实现,我是这样想的,循环i,从1开始循环,知道每次行的开头下标和结尾下标,看n是否在这个之间,在就退出循环,i就是深度
//获取深度
int f(int n){
int i=1;
while(1){
//2的i-1次方,就是第i层的开头
int head=f1(i-1);
//2的i次方-1,就是第i层的结尾
int rear=f1(i)-1;
if(n>=head&&n<=rear){
break;
}
i++;
}
return i;
}
代码:
#include <iostream>
using namespace std;
int f(int n){//2的n次方
int sum=1;
for(int i=0;i<n;i++){
sum*=2;
}
return sum;
}
int main()
{
//因为是完全二叉树,所以我使用数组来存储更方便一些
int n;
while(cin>>n){
if(n==0){
break;
}
int p[1000];
for(int i=1;i<=n;i++){
cin>>p[i];
}
int m;
cin>>m;
int p1=f(m-1);//2的m-1次方,这是第m行开头第一个元素的下标
int p2=f(m)-1;//从第一行到第m行一共有多少个元素
if(p1<=n&&p2<=n){//从p1到p2遍历
int i;
for(i=p1;i<p2;i++){
cout<<p[i]<<" ";
}
cout<<p[i]<<endl;
}else if(p1<=n&&p2>n){//从p1到n遍历
int i;
for(i=p1;i<n;i++){
cout<<p[i]<<" ";
}
cout<<p[i]<<endl;
}else if(p1>n){
cout<<"EMPTY"<<endl;
}
}
return 0;
}
结果截图: