UVa 122 Trees on the level(链式二叉树的建立和层次遍历)

题目链接:

https://cn.vjudge.net/problem/UVA-122

  1 /*
  2 问题
  3 给出每个节点的权值和路线,输出该二叉树的层次遍历序列。
  4 
  5 解题思路
  6 根据输入构建链式二叉树,再用广度优先遍历保存权值最后输出。 
  7 */ 
  8 #include<cstdio>
  9 #include<cstring>
 10 #include<vector>
 11 #include<queue>
 12 using namespace std;
 13 const int maxn=110;
 14 bool failed;
 15 
 16 struct NODE{
 17     bool have_value;
 18     int v;
 19     NODE *left,*right;
 20     NODE() : have_value(false),left(NULL),right(NULL){};
 21 };
 22 NODE* newnode(){
 23     return new NODE();
 24 }
 25 NODE* root;
 26 
 27 bool read_input();
 28 void addnode(int v,char *s);
 29 bool bfs(vector<int> &ans);
 30 void remove_tree(NODE* u){
 31     if(u == NULL) return;
 32     remove_tree(u->left);
 33     remove_tree(u->right);
 34     delete u;
 35 }
 36 
 37 int main()
 38 {
 39     //freopen("E:\\testin.txt","r",stdin);
 40     vector<int> ans;
 41     while(read_input()){
 42         if(failed || !bfs(ans))
 43             printf("not complete\n");
 44         else{
 45             int i;
 46             for(i=0;i<ans.size()-1;i++)
 47                 printf("%d ",ans[i]);
 48             printf("%d\n",ans[i]); 
 49         }
 50     }
 51     return 0;
 52 }
 53 
 54 bool bfs(vector<int> &ans){
 55     queue<NODE*> q;
 56     ans.clear();
 57     q.push(root);
 58     
 59     while(!q.empty()){
 60         NODE* u =q.front(); q.pop();
 61         if(!u->have_value)    return false;
 62         ans.push_back(u->v);
 63         
 64         if(u->left != NULL)    q.push(u->left);
 65         if(u->right != NULL) q.push(u->right);
 66     }
 67     return true;
 68 }
 69 void addnode(int v,char *s){
 70     int len=strlen(s);
 71 
 72     NODE* u= root;
 73     for(int i=0;i<len;i++){
 74         if(s[i] == 'L'){
 75             if(u->left == NULL) 
 76                 u->left= newnode();
 77             u=u->left;        
 78         }else if(s[i] == 'R'){
 79             if(u->right == NULL) 
 80                 u->right= newnode();
 81             u=u->right;
 82         }
 83     }
 84     
 85     if(u->have_value)    failed=true;
 86     u->v= v;
 87     u->have_value=true;
 88 }
 89 bool read_input(){
 90     char s[maxn];
 91     failed=false;
 92     remove_tree(root);
 93     root=newnode();
 94     for(;;){
 95         if(scanf("%s",s) != 1)    return false;
 96         if(!strcmp(s,"()"))    break;
 97         int v;
 98         sscanf(s+1,"%d",&v);
 99         addnode(v,strchr(s,',')+1);
100     }
101     return true;
102 }

 

posted @ 2018-06-03 17:09  Reqaw  阅读(210)  评论(0编辑  收藏  举报