Uva 122(Trees on the level)树的层次遍历

题目:

输入一棵二叉树,你的任务是按从上到下、从左到右的顺序输出各个结点的值。每个结点都按照从根结点到它的移动序列给出(L表示左,R表示右)。在输入中,每个结点的左括号和右括号之间没有空格,相邻结点之间用一个空格隔开。每棵树的输入用一对空括号()结束(这对括号本身不代表一个结点)。注意:如果从根到某个结点的路径上有的结点没有在输入中给出,或者给出了超过一次,应当输出not complete.节点个数不超过256.

样例输入:

 (11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
(3,L) (4,R) ()

样例输出:

5 4 8 11 13 4 7 2 1

not complete

  1 /*
  2 Uva 122
  3 不释放内存的做法
  4 vector.end()指向的是最后一个元素的下一个位置,所以访问最后一个元素的正确操作为:vector.end() - 1;
  5 */
  6 #include<iostream>
  7 #include<cstdio>
  8 #include<queue>
  9 #include<vector>
 10 #include<string.h>
 11 using namespace std;
 12 const int maxn = 1000000;
 13 char s[maxn];
 14 
 15 bool failed;
 16 vector<int> ans;
 17 struct node
 18 {
 19     bool have_value;
 20     int v;
 21     node* left;
 22     node* right;
 23 };
 24 node* root;
 25 void addnode(int v, char* s)
 26 {
 27     int n = strlen(s);
 28     node* u = root;
 29     for (int i = 0; i < n; i++)
 30         if (s[i] == 'L')
 31         {
 32             if (u->left == NULL)u->left = new node();
 33             u = u->left;
 34         }
 35         else if (s[i] == 'R')
 36         {
 37             if (u->right == NULL)u->right = new node();
 38             u = u->right;
 39         }
 40     if (u->have_value) failed = true;
 41     u->v = v;
 42     u->have_value = true;
 43 }
 44 bool read_input()
 45 {
 46     failed = false;
 47     root = new node();
 48     for (;;)
 49     {
 50         if (scanf("%s", s) != 1) return false;
 51         if (!strcmp(s, "()"))break;
 52         int v;
 53         sscanf(&s[1], "%d", &v);//sscanf的妙用运用
 54                                 //int sscanf(     const char *buffer,     const char *format, [ argument ] ); 
 55                                 //buffe 存储的数据
 56                                 //format窗体控件字符串。 有关详细信息,请参阅"格式规范"。
 57                                 //argument可选自变量
 58                                 //第一个地址指向的数据必须要与format相同,否则会出错
 59         addnode(v, strchr(s, ',') + 1);//函数原型char* strchr(const char* str, int c)
 60                                         //参数str要被检索的 C 字符串。c在 str 中要搜索的字符。
 61                                         //功能在参数str所指向的字符串中搜索第一次出现字符c(一个无符号字符)的位置。
 62                                         //返回值返回一个指向该字符串中第一次出现的字符的指针
 63                                         //如果字符串中不包含该字符则返回NULL空指针。
 64     }
 65     return true;
 66 }
 67 bool bfs(vector<int>& ans)
 68 {
 69     queue<node*>q;
 70     ans.clear();
 71     q.push(root);
 72     while (!q.empty())
 73     {
 74         node* u = q.front(); q.pop();
 75         if (!u->have_value)return false;
 76         ans.push_back(u->v);
 77         if (u->left != NULL)q.push(u->left);
 78         if (u->right != NULL)q.push(u->right);
 79     }
 80     return true;
 81 }
 82 int main()
 83 {
 84     while (read_input())
 85     {
 86         
 87         if (!failed&&bfs(ans))
 88         {
 89             //vector<int> iterator .end(),
 90             //是指向end的下一个指针vector.end()指向的是最后一个元素的下一个位置
 91             //所以访问最后一个元素的正确操作为:vector.end() - 1;
 92             for (vector<int>::iterator i = ans.begin(); i < ans.end() - 1; i++)
 93                 cout << *i << " ";
 94             vector<int>::iterator i = ans.end() - 1;
 95             cout << *i << endl;
 96         }
 97         else printf("not complete\n");
 98         memset(s, NULL, sizeof(s));
 99     }
100     return 0;
101 
102 }

猜你喜欢

转载自www.cnblogs.com/Dinosaur-Po/p/12699523.html