【專題複習1:樹的遍歷】1004、1020
阿新 • • 發佈:2022-02-25
1004
#include <bits/stdc++.h> using namespace std; vector<int> G[101]; int leaf[101]; int maxh; void DFS(int root,int h) { maxh=max(maxh,h); if(G[root].size()==0){ leaf[h]++; return; } for(int i=0;i<G[root].size();i++) DFS(G[root][i],h+1); } int main() { int n,m,id,k,child; cin>>n>>m; for(int i=0;i<m;i++){ cin>>id>>k; for(int j=0;j<k;j++){ cin>>child; G[id].push_back(child); } } DFS(1,1); for(int i=1;i<=maxh;i++){ if(i!=1) cout<<" "; cout<<leaf[i]; } return 0; }
1020
#include <bits/stdc++.h> using namespace std; struct node { int data; node* lc; node* rc; }; vector<int> post,in; int n,num=0; node* create(int pl,int pr,int il,int ir) { if(pl>pr) return nullptr; node* r=new node; r->data=post[pr]; int i=0; while(in[i]!=post[pr]) i++; r->lc=create(pl,pl+i-il-1,il,i-1); r->rc=create(pl+i-il,pr-1,i+1,ir); return r; } void bfs(node* root) { queue<node*> q; q.push(root); while(!q.empty()){ node* now=q.front(); q.pop(); cout<<now->data; num++; if(num<n) cout<<" "; if(now->lc!=nullptr) q.push(now->lc); if(now->rc!=nullptr) q.push(now->rc); } } int main() { #ifdef ONLINE_JUDGE #else freopen("1.txt", "r", stdin); #endif cin>>n; post.resize(n);in.resize(n); for(int i=0;i<n;i++) cin>>post[i]; for(int i=0;i<n;i++) cin>>in[i]; node* root=create(0,n-1,0,n-1); bfs(root); return 0; }
不理解為何這種寫法編譯沒錯卻提示段錯誤
#include <bits/stdc++.h> using namespace std; struct node { int data; node* lc; node* rc; }; vector<int> post,in; node* root; int n,num=0; void create(int pl,int pr,int il,int ir,node* &root) { if(pl>pr) return ; root->data=post[pr]; int i=0; while(in[i]!=post[pr]) i++; create(pl,pl+i-il-1,il,i-1,root->lc); create(pl+i-il,pr-1,i+1,ir,root->rc); } void bfs() { queue<node*> q; q.push(root); while(!q.empty()){ node* now=q.front(); q.pop(); cout<<now->data; num++; if(num<n) cout<<" "; if(now->lc!=nullptr) q.push(now->lc); if(now->rc!=nullptr) q.push(now->rc); } } int main() { #ifdef ONLINE_JUDGE #else freopen("1.txt", "r", stdin); #endif cin>>n; post.resize(n);in.resize(n); for(int i=0;i<n;i++) cin>>post[i]; for(int i=0;i<n;i++) cin>>in[i]; create(0,n-1,0,n-1,root); bfs(); return 0; }
本文來自部落格園,作者:勇往直前的力量,轉載請註明原文連結:https://www.cnblogs.com/moonlight1999/p/15933777.html