今天一神给我手敲二叉树模板,瞬间就领悟了,感觉自己萌萌哒!
看上去很直观!
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <vector> #include <queue> using namespace std; const int maxn = 1e3+5; int a[maxn]; int b[maxn]; int floor[maxn]; int tr[maxn<<2]; void build(int x,int al,int ar,int bl,int br) //和线段树差不多 { if(ar<al||br<bl) return; if(al==ar) { tr[x] = a[al]; return; } for(int i = al; i<=ar; i++) { if(a[i]==b[br]) { tr[x] = b[br]; build(2 * x , al , i - 1 , bl , bl + i - 1 - al); //左子树的左端点,右端点,在a数组和b数组。 build(2 * x + 1 , i + 1, ar , bl + i - al, br - 1); //右子树的左端点,右端点,在a数组和b数组。 break; } } } /*void dfs(int x) //按先序遍历 { if(!tr[x]) return; printf("%d ",tr[x]); dfs(2*x); dfs(2*x+1); }*/ void bfs(int x) //按层序遍历 { queue<int> q; q.push(x); int ans = 1; while(!q.empty()) { int y = q.front(); q.pop(); if(tr[y]==0) continue; floor[ans++] = tr[y]; q.push(2*y); q.push(2*y+1); } } int main() { int n; memset(tr,0,sizeof(tr)); scanf("%d",&n); for(int i = 1; i<=n; i++) { scanf("%d",&b[i]); } for(int i = 1; i<=n; i++) { scanf("%d",&a[i]); } build(1,1,n,1,n); //dfs(1); bfs(1); for(int i = 1; i<n; i++) printf("%d ",floor[i]); printf("%d ",floor[n]); return 0; }
只求先序时,不用遍历。
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <vector> #include <queue> using namespace std; const int maxn = 1e3+5; int a[maxn]; int b[maxn]; vector<int> g; void build(int x,int al,int ar,int bl,int br) { if(ar<al||br<bl) return; if(al==ar) { g.push_back(a[al]); return; } for(int i = al; i<=ar; i++) { if(a[i]==b[br]) { g.push_back(a[i]); build(2 * x , al , i - 1 , bl , bl + i - 1 - al); build(2 * x + 1 , i + 1, ar , bl + i - al, br - 1); break; } } } int main() { int n; scanf("%d",&n); for(int i = 1; i<=n; i++) { scanf("%d",&b[i]); } for(int i = 1; i<=n; i++) { scanf("%d",&a[i]); } build(1,1,n,1,n); for(int i = 0; i<g.size()-1; i++) printf("%d ",g[i]); printf("%d ",g[g.size()-1]); return 0; }