1 /*输入一颗二叉树,你的任务是按从上到下,从左到右的顺序输出各个结点的值.每个结点都按照从根结点到它的移动序列给出(L表示左,R表示右).在输入中,每个结点的左括号和右括号之间没有空格,相邻结点之间用一个空格隔开.每棵树的输入用一堆空口号()结束(这对括号本身不代表一个结点) 2 3 样例输入:(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) () 4 5 (3,L) (4,R) () 6 7 样例输出: 8 9 5 4 8 11 13 4 7 2 1 10 11 -1 12 13 AC代码如下:*/ 14 15 #include <iostream> 16 #include <string> 17 #include <sstream> 18 using namespace std ; 19 const int MAXN = 256 ; 20 const int root = 1 ; 21 int cnt , vis[MAXN] , val[MAXN] , Left[MAXN] , Right[MAXN] ; 22 int NewNode() 23 { 24 int u = ++cnt ; 25 Left[u] = Right[u] = 0 ; 26 return u ; 27 } 28 void NewTree() 29 { 30 Left[root] = Right[root] = 0 ; 31 cnt = root ; 32 } 33 int failed ; 34 void AddNode(int value , string word) 35 { 36 int u = root ; 37 for (size_t i = 0 ; i < word.size() ; i ++) 38 { 39 if (word.at(i) == 'L') 40 { 41 if (!Left[u]) 42 { 43 Left[u] = NewNode() ; 44 } 45 u = Left[u] ; 46 } 47 else if (word.at(i) == 'R') 48 { 49 if (!Right[u]) 50 { 51 Right[u] = NewNode() ; 52 } 53 u = Right[u] ; 54 } 55 } 56 if (vis[u]) 57 { 58 failed = 1 ; 59 } 60 val[u] = value ; 61 vis[u] = 1 ; 62 } 63 64 int Input_Read() 65 { 66 cnt = 0 ; 67 memset(vis,0,sizeof(vis)) ; 68 69 failed = 0 ; 70 NewTree() ; 71 string word ; 72 while (true) 73 { 74 cin >> word ; 75 if (cin.eof()) 76 { 77 return 0 ; 78 } 79 if (word == "()") 80 { 81 break ; 82 } 83 stringstream sin(word) ; 84 int tmp ; 85 sin.ignore(1) ; 86 sin >> tmp ; 87 AddNode(tmp,strchr(word.c_str(),',')+1) ; 88 } 89 return 1 ; 90 } 91 92 int n = 0 , ans[MAXN] ; 93 94 int bfs() 95 { 96 int front = 0 , rear = 1 ; 97 int q[MAXN] ; 98 q[0] = root ; 99 memset(ans,0,sizeof(ans)) ; 100 101 while (front < rear) 102 { 103 int u = q[front++] ; 104 if (!vis[u]) 105 { 106 return 0 ; 107 } 108 ans[n++] = val[u] ; 109 if (Left[u]) 110 { 111 q[rear++] = Left[u] ; 112 } 113 if (Right[u]) 114 { 115 q[rear++] = Right[u] ; 116 } 117 } 118 return 1 ; 119 } 120 121 int main() 122 { 123 124 while (Input_Read()) 125 { 126 127 if (!bfs()) 128 { 129 failed = 1 ; 130 } 131 if (failed) 132 { 133 cout << -1 << endl ; 134 } 135 else { 136 for (int i = 0 ; i < n ; ++ i) 137 { 138 cout << ans[i] << " " ; 139 } 140 cout << endl ; 141 } 142 } 143 144 return 0 ; 145 }