例題6-7 樹的層次遍歷 UVa122
阿新 • • 發佈:2018-12-24
2.解題思路:本題是訓練二叉樹的一道好題。首先要解決讀資料問題,根據題意,當輸入為“()”時,結束該組資料讀入,當沒有字串時,整個輸入結束。因此可以專門編寫一個readin()函式,型別設定為bool型,遇到第一種情況時返回true,遇到第二種情況返回false,主程式中只要發現readin返回false時就break,結束整個大迴圈。
接下來要建立二叉樹,首先為二叉樹編寫一個結構體,然後根據字串的輸入情況來建樹,如果是‘L’就往左走,走不動時建一顆新樹,同樣的方法處理右子樹,最後讀入結點值。由於輸入可能有誤,因此用一個全域性變數failed來記錄是否有輸入錯誤的情況出現,如果在建樹過程中發現該結點已經被賦過值,那麼全域性變數failed變為true。
最後開始BFS找結點值,此時可能出現有結點沒有結點值的情況,因此要把bfs定義為bool型,只要出現這種非法情況,返回false。最後便不難根據情況進行輸出了。
3.程式碼:
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<string> #include<sstream> #include<set> #include<vector> #include<stack> #include<map> #include<queue> #include<deque> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<functional> using namespace std; #define N 256+10 char s[N]; struct Node { int v; bool have_value; Node*left, *right; Node() :have_value(false), left(NULL), right(NULL){} }; Node*root;//根結點,使用前要申請空間 bool failed;//記錄輸入是否有誤 Node*newnode(){ return new Node(); } void addnode(int v, char*s) { int n = strlen(s); Node*u = root; for (int i = 0; i < n; i++) if (s[i] == 'L') { if (u->left == NULL)u->left = newnode(); u = u->left; } else if (s[i] == 'R') { if (u->right == NULL)u->right = newnode(); u = u->right; } if (u->have_value)failed = true;//已經賦過值了,說明輸入有誤 u->v = v; u->have_value = true;//標記為已經賦值 } bool readin()//讀資料 { failed = false; for (;;) { if (scanf("%s", s)!=1)return false;//整個輸入結束 if (!strcmp(s, "()"))break;//讀到結束標誌,退出迴圈 int v; sscanf(&s[1], "%d", &v);//讀入結點值 addnode(v, strchr(s, ',') + 1);//查詢逗號,然後插入結點 } return true; } bool bfs(vector<int>&ans)//利用bfs進行遍歷,並將結點值放入vector中 { queue<Node*>q; ans.clear(); q.push(root); while (!q.empty()) { Node*u = q.front(); q.pop(); if (!u->have_value)return false;//沒有結點值,返回false ans.push_back(u->v); if (u->left != NULL)q.push(u->left); if (u->right != NULL)q.push(u->right); } return true; } int main() { //freopen("t.txt", "r", stdin); while(1) { root = newnode(); if (!readin())break; vector<int>ans; if (!failed&&bfs(ans)) { int len = ans.size(); for (int i = 0; i < len; i++) printf("%d%c", ans[i], i == len - 1 ? '\n' : ' '); } else puts("not complete"); } return 0; }