动态写法
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <algorithm>
#include <functional>
#include <utility>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <cctype>
#define CLEAR(a, b) memset(a, b, sizeof(a))
#define IN() freopen("in.txt", "r", stdin)
#define OUT() freopen("out.txt", "w", stdout)
#define LL long long
#define maxn 305
#define maxm 6000005
#define mod 10007
#define INF 1000000007
#define EPS 1e-7
#define PI 3.1415926535898
#define N 4294967296
using namespace std;
//-------------------------CHC------------------------------//
struct Node {
bool have_val;
int val;
Node *left, *right;
Node() : have_val(false), left(NULL), right(NULL) { }
};
bool ok;
int ans[maxn], cnt;
void add(int val, char *s, Node *root) {
Node *cur = root;
while (*s) {
if (*s == 'L') {
if (!cur->left) cur->left = new Node();
cur = cur->left;
}
else if (*s == 'R') {
if (!cur->right) cur->right = new Node();
cur = cur->right;
}
++s;
}
if (cur->have_val) ok = false;
cur->val = val, cur->have_val = true;
}
void BFS(Node *root) {
queue<Node *> q;
q.push(root);
while (q.size()) {
Node *cur = q.front(); q.pop();
if (!cur->have_val) { ok = false; return; }
ans[cnt++] = cur->val;
if (cur->left) q.push(cur->left);
if (cur->right) q.push(cur->right);
}
}
void _delete(Node *root) {
if (!root) return;
_delete(root->left);
_delete(root->right);
delete(root);
}
char s[maxn];
int main() {
int val;
while (~scanf("%s", s)) {
ok = true, cnt = 0;
Node *root = new Node();
sscanf(s + 1, "%d", &val);
add(val, strchr(s, ',') + 1, root);
while (scanf("%s", s) && strcmp(s, "()")) {
sscanf(s + 1, "%d", &val);
add(val, strchr(s, ',') + 1, root);
}
BFS(root);
if (ok) {
printf("%d", ans[0]);
for (int i = 1; i < cnt; ++i) printf(" %d", ans[i]);
puts("");
}
else puts("not complete");
_delete(root);
}
return 0;
}
内存池,动态化静态做法
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <algorithm>
#include <functional>
#include <utility>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <cctype>
#define CLEAR(a, b) memset(a, b, sizeof(a))
#define IN() freopen("in.txt", "r", stdin)
#define OUT() freopen("out.txt", "w", stdout)
#define LL long long
#define maxn 305
#define maxm 6000005
#define mod 10007
#define INF 1000000007
#define EPS 1e-7
#define PI 3.1415926535898
#define N 4294967296
using namespace std;
//-------------------------CHC------------------------------//
struct Node {
bool have_val;
int val;
Node *left, *right;
Node() : have_val(false), left(NULL), right(NULL) { }
}node[maxn]; //内存池
bool ok;
vector<int> ans;
queue<Node*> freenodes; // 空闲列表
void init() {
for (int i = 0; i < maxn; ++i) freenodes.push(node + i);
}
Node *newnode() {
Node *ret = freenodes.front();
freenodes.pop();
return ret;
}
void add(int val, char *s, Node *root) {
Node *cur = root;
while (*s) {
if (*s == 'L') {
if (!cur->left) cur->left = newnode();
cur = cur->left;
}
else if (*s == 'R') {
if (!cur->right) cur->right = newnode();
cur = cur->right;
}
++s;
}
if (cur->have_val) ok = false;
cur->val = val, cur->have_val = true;
}
void BFS(Node *root) {
queue<Node *> q;
q.push(root);
while (q.size()) {
Node *cur = q.front(); q.pop();
if (!cur->have_val) { ok = false; return; }
ans.push_back(cur->val);
if (cur->left) q.push(cur->left);
if (cur->right) q.push(cur->right);
}
}
void _delete(Node *u) { freenodes.push(u); }
void remove_tree(Node *root) {
if (!root) return;
remove_tree(root->left);
remove_tree(root->right);
_delete(root);
}
char s[maxn];
int main() {
int val;
init();
while (~scanf("%s", s)) {
ans.clear();
ok = true;
Node *root = newnode();
sscanf(s + 1, "%d", &val);
add(val, strchr(s, ',') + 1, root);
while (scanf("%s", s) && strcmp(s, "()")) {
sscanf(s + 1, "%d", &val);
add(val, strchr(s, ',') + 1, root);
}
BFS(root);
if (ok) {
printf("%d", ans[0]);
for (int i = 1; i < ans.size(); ++i) printf(" %d", ans[i]);
puts("");
}
else puts("not complete");
remove_tree(root);
}
return 0;
}