UVa10410 Tree Reconstruction(bfs+dfs確定二叉樹)
阿新 • • 發佈:2018-11-06
題意就是給你二叉樹的bfs和dfs遍歷,都是結點小的優先遍歷
本來自己沒做出來,不想寫的,做了半天測試資料是對的,但是WA。因為看了一個大佬的解法,讓我感慨萬分,簡潔而直接的解法,正確而清晰的思路,讓我佩服的五體投地。充分運用的bfs,dfs,以及棧的性質,這句話很重要,程式碼真是藝術,總存在最簡解法。
#include<iostream> #include <string> #include <string.h> #include<vector> #include<stack> using namespace std; const int maxn = 1000 + 5; int bfs[maxn]; vector<int>tree[maxn]; int main() { int n; int temp; while (cin >> n && n) { for (int i = 1; i <= n; i++) { cin >> temp; bfs[temp] = i; tree[i].clear(); } int next; cin >> next; stack<int>sp; sp.push(next); for (int i = 1; i < n; i++) { cin >> next; while (1) { int root = sp.top(); if (bfs[next] > bfs[root] + 1 || (bfs[root] + 1 == bfs[next] && root > next) || root == next) {//第二個判斷就是結點小的優先搜尋 tree[root].push_back(next); sp.push(next); //加入要搜尋子節點的棧 break; } else { sp.pop();//沒有搜尋到子節點 回退上一個節點 } } } for (int i = 1; i <= n; i++) { cout << i << ":"; for (int j = 0,sz= tree[i].size(); j < sz; j++) { cout << " "<<tree[i][j]; } cout << endl; } } //system("pause"); return 0; }