题目:
输入一棵二叉树,你的任务是按从上到下、从左到右的顺序输出各个结点的值。每个结点都按照从根结点到它的移动序列给出(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 }