UVa 122 - Trees on the level

Contents

  1. 1. Problem
  2. 2. Solution
  3. 3. Code

Problem

中文網址

Solution

先 parse 字串,也可用 std::stringstream
將節點依指令插入,記得處理節點已存在時。
插完後遍歷一次,再檢查有沒有沒走到的點即可。

Code

UVa 122
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include<cstdio>
#define Left(n) ((n)<<1)
#define Right(n) (((n)<<1)+1)
#define N 32768

int tree[N];
bool isVisit[N];
inline bool input(int& val, char *str)
{
char c;
val = 0;
while ((c = getchar()) != '(')
if (c == EOF)
return false;

if ((c = getchar()) == ')')
return false;
else
val = c - '0';

while ((c = getchar()) != ',')
val = val * 10 + c - '0';

int i;
for (i = 0;; i++)
{
c = getchar();

if (c == ')')
{
str[i] = NULL;
break;
}

str[i] = c;
}

return true;
}
inline bool insert(int val, char* str)
{
int idx = 1;
if (!str[0])
{
if (tree[1] != -1)
return false;
tree[1] = val;
return true;
}

for (int i = 0; str[i]; i++)
if (str[i] == 'L')
idx = Left(idx);
else
idx = Right(idx);

if (tree[idx] != -1)//處理重複節點
return false;

tree[idx] = val;
return true;
}
inline void traverse(int idx)//VLR
{
if (idx < N&&tree[idx] != -1)
{
isVisit[idx] = true;
traverse(Left(idx));
traverse(Right(idx));
}
}
int main()
{
int val;
char str[10];

while (input(val, str))
{
int i, count = 1;
bool isOk = true;

for (i = 0; i < N; i++)
{
tree[i] = -1;
isVisit[i] = false;
}

isOk = insert(val, str);
while (input(val, str))
{
if (isOk)
{
isOk = insert(val, str);
count++;
}
}

if (isOk)
{
traverse(1);

int temp = 0;
for (i = 1; i < N&&temp < count; i++)
if (tree[i] != -1)
{
if (isVisit[i])
temp++;
else
{
isOk = false;
break;
}
}
}

if (isOk)
{
bool first = true;
int temp = 0;
for (i = 0; i < N&&temp < count; i++)
{
if (tree[i] != -1)
{
if (first)
first = false;
else
putchar(' ');

printf("%d", tree[i]);
temp++;
}
}
putchar('\n');
}
else
puts("not complete");

}

return 0;
}