2020.11 程式設計天梯賽 L2-3 完全二叉樹的層序遍歷 (25分)
阿新 • • 發佈:2020-12-01
L2-3 完全二叉樹的層序遍歷 (25分)
題意:給出一棵完全二叉樹的後序遍歷,輸出對應層序遍歷。
思路:對於給定的後序遍歷序列,可以知道最後一個元素是樹的根節點,可以使用遞迴建樹。
1.若當前結點的右子樹不為空則繼續將右子樹遍歷,若右子樹為空則判斷當前結點是否存在右兒子,右兒子的編號為 this.num*2+1,如果右兒子的編號小於等於結點的數量n則表示存在右兒子,在此新建結點。
2.若右子樹不滿足條件則考慮左子樹,同樣是假如當前結點的左子樹不為空則繼續向左子樹遍歷,否則判斷當前結點是否存在左兒子,左兒子的編號為 this.num*2,如果左兒子的編號小於等於結點的數量n則表示存在左兒子,在此新建結點。
3.使用佇列實現層序遍歷。
程式碼:
#include <set> #include <map> #include <list> #include <stack> #include <queue> #include <deque> #include <cmath> #include <string> #include <vector> #include <cstdio> #include <cstring> #include <cstdlib> #include <sstream> #include <iostream> #include <algorithm> //#include <unordered_map> #define INF 0x3f3f3f3f #define ll long long #define ull unsigned long long #define FILL(a,n,v) fill(a,a+n,v) #define Mset(a,v) memset(a,v,sizeof a) #define Mcpy(a,b) memcpy(a,b,sizeof b) //a=b #define fcio ios::sync_with_stdio(false); cin.tie(0); cout.tie(0) #define fcin freopen("in.txt","r",stdin) #define fcout freopen("out.txt","w",stdout) #define mian main #define ture true #define esle else #define falg flag using namespace std; int n; int a[35]; struct node { int value; int level; node* l; node* r; node(int value) { this->value=value; this->l=NULL; this->r=NULL; this->level=1; } }; bool flag; void build(node* root,int a,int num) { if(flag) return ; if(root->r) build(root->r,a,num*2+1); else if(num*2+1<=n) { flag=true; root->r=new node(a); return; } if(flag) return ; if(root->l) build(root->l,a,num*2); else if(num*2<=n) { flag=true; root->l=new node(a); return; } } int res[50]; int cnt=0; void levelOrder(node* root) { queue<node*>q; node* now=root; q.push(now); while(q.size()) { now=q.front(); res[cnt++]=now->value; q.pop(); if(now->l) q.push(now->l); if(now->r) q.push(now->r); } } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; reverse(a+1,a+n+1); node* root=new node(a[1]); for(int i=2;i<=n;i++) { flag=false; build(root,a[i],1); } levelOrder(root); for(int i=0;i<cnt;i++) { cout<<res[i]<<(i==n-1?'\n':' '); } }