題目描述
小圖參觀附近的一個村莊。湊巧的是,村子里街道的排列與K層完美二叉樹的形狀非常相似。K層完美二叉樹由K層共2K?12^K - 12K?1個結點組成。每個節點包含一個標有門牌號的建筑物。此外,除了最后一層的建筑外,所有的建筑都有一個左右子結點(如下圖所示)。 2層和3層完美二叉樹
小圖參觀了一個村莊的所有建筑,并記下了確切的入口順序。現在他想給你描述一下這個村莊的樣子,但是他不太記得了。幸運的是,他還記得他參觀這些建筑的方式:
一開始,他站在第一層中唯一的一幢建筑前。
如果他現在面對的建筑有一個他還沒有拜訪過的左子結點,他就會走到左子結點的前面。
如果這棟建筑沒有左子結點,或者他已經拜訪過這個左子結點,他就會進入這棟建筑訪問,在紙上寫下這棟建筑的門牌號。
如果他已經訪問了當前這棟建筑,并且該建筑有一個右子結點,他將走到右子結點前面。
如果他訪問了當前這棟建筑及其左右子結點,他將回傳到當前建筑的父結點。 在參觀了上面圖片中的村莊后,紙上寫了這樣的數字:給上圖第一個村莊寫了2-1-3,給上圖第二個村莊寫了1-6-4-3-5-2-7。你的任務是撰寫一個程式來幫助小圖重建每一層建筑的門牌號。
輸入格式
第一行輸入包含整數K,即小圖訪問的村莊的層次數。 第二行輸入包含2K?12^K - 12K?1個整數,這是小圖紙上的門牌號序列。門牌號的數字將是唯一的,數字在1到2K?12^K - 12K?1之間。
輸出格式
輸出由K行組成。第i行包含村莊第i層建筑的門牌號。
輸入輸出樣例
輸入 #1
2
2 1 3
輸出 #1
1
2 3
輸入 #2
3
1 6 4 3 5 2 7
輸出 #2
3
6 2
1 4 5 7
這樣寫有什么問題啊
#include <iostream>
#include <cmath>
using namespace std;
int a[1048586],num[21][1048586],k,n,abcde = 0;
bool visit[21];
void tree(int begin,int end,int x)
{
int middle;
if(!visit[x]) abcde = 0;
visit[x] = 1;
middle = (end - begin + 2) / 2 + begin - 1;
num[x][abcde] = a[middle];
abcde++;
if(x == k) return;
tree(begin,middle - 1,x + 1);
tree(middle + 1,end,x + 1);
}
int main()
{
int i,j;
cin>>k;
n = pow(2,k) - 1;
for(i = 1;i <= n;i++)
{
cin>>a[i];
}
tree(1,n,1);
for(i = 0;i < k;i++)
{
for(j = 0;j < pow(2,i + 1);j++)
{
cout<<num[i][j]<<' ';
}
cout<<endl;
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/11063.html
標籤:C++ 語言
上一篇:while(scanf("%d",&a)!=EOF)
下一篇:MATLAB仿真激光測距方程
