https://www.patest.cn/contests/pat-a-practise/1110
层序遍历,如果没有child时打标记,如果再出现inValid
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#define MAXN 21
using namespace std;
typedef struct node {
int v, l, r;
node() {
v = -1,l = -1, r = -1;
}
}Node;
int father[MAXN];
Node nodes[MAXN];
int n;
int main()
{
string sl, sr;
int l, r;
cin >> n;
memset(father, -1, sizeof(father));
for (int i = 0; i < n; i++)
{
cin >> sl >> sr;
nodes[i].v = i;
if (sl != "-") {
l = stoi(sl.c_str());
father[l] = i;
nodes[i].l = l;
}
if (sr != "-") {
r = stoi(sr.c_str());
father[r] = i;
nodes[i].r = r;
}
}
int root;
for (int i = 0; i < n; i++)
{
if (father[i] == -1) root = i;
}
bool nochild = false,inValid = false;
queue<Node> q;
q.push(nodes[root]);
int lastnode = root;
Node node;
while (!q.empty()) {
node = q.front();
q.pop();
if (node.l != -1) {
if (nochild) {
inValid = true; break;
}
q.push(nodes[node.l]);
lastnode = node.l;
}
else {
nochild = true;
}
if (node.r != -1) {
if (nochild) {
inValid = true; break;
}
q.push(nodes[node.r]);
lastnode = node.r;
}
else {
nochild = true;
}
}
if (!inValid) printf("YES %d\n",lastnode);
else printf("NO %d\n", root);
return 0;
}
另附一份“聪明”的代码:
http://www.liuchuo.net/archives/2158
#include <cstdio>
#include <queue>
#include <vector>
#include <string.h>
using namespace std;
struct TREE {
int left;
int right;
};
int main() {
int n, root = 0;
scanf("%d", &n);
vector<TREE> tree(n);
vector<int> book(n);
for(int i = 0; i < n; i++) {
char l[3], r[3];
scanf("%s %s", l, r);
if(l[0] == '-') {
tree[i].left = -1;
} else {
int temp = l[0] - '0';
if(strlen(l) == 2) {
temp = temp * 10 + (l[1] - '0');
}
tree[i].left = temp;
}
if(r[0] == '-') {
tree[i].right = -1;
} else {
int temp = r[0] - '0';
if(strlen(r) == 2) {
temp = temp * 10 + (r[1] - '0');
}
tree[i].right = temp;
}
if(tree[i].left != -1)
book[tree[i].left] = 1;
if(tree[i].right != -1)
book[tree[i].right] = 1;
}
for(int i = 0; i < n; i++) {
if(book[i] == 0) {
root = i;
break;
}
}
queue<int> q;
q.push(root);
int cnt = 0;
int lastnode = 0;
while(!q.empty()) {
int node = q.front();
q.pop();
if(node != -1) {
lastnode = node;
cnt++;
}else {
if(cnt != n)
printf("NO %d", root);
else
printf("YES %d", lastnode);
return 0;
}
q.push(tree[node].left);
q.push(tree[node].right);
}
return 0;
}