題目描述
一個二叉樹,如果每一個層的結點數都達到最大值,則這個二叉樹就是完美二叉樹。對於深度為 D 的,有 N 個結點的二叉樹,若其結點對應於相同深度完美二叉樹的層序遍歷的前 N 個結點,這樣的樹就是完全二叉樹。
給定一棵完全二叉樹的后序遍歷,請你給出這棵樹的層序遍歷結果。
輸入格式
輸入在第一行中給出正整數 N(≤30),即樹中結點個數。第二行給出后序遍歷序列,為 N 個不超過 100 的正整數。同一行中所有數字都以空格分隔。
輸出格式
在一行中輸出該樹的層序遍歷序列。所有數字都以 1 個空格分隔,行首尾不得有多余空格。
輸入樣例
8
91 71 2 34 10 15 55 18
輸出樣例
18 34 55 71 2 10 15 91
思路
這道題借鑒的別人的思路,真的很巧妙,既然題目給定后續遍歷,那么我們完全可以用一棵空樹,走一遍后續遍歷的過程,然后將給定的后續遍歷存儲進去
代碼
#include<iostream>
using namespace std;
const int N = 35;
int a[N];
int n;
int b[N];
int cnt = 1;
void dfs(int p) {
if(p > n){
return;
}
dfs(p*2);
dfs(p*2+1);
b[p] = a[cnt++];
}
int main(){
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
dfs(1);
for(int i = 1; i <= n; i++){
cout << b[i];
if(i != n) cout << " ";
}
puts("");
return 0;
}