题意:输入一颗二叉树,判断是否是完全二叉树,是输出最后一个节点,不是输出根。
思路:建树,层序遍历。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <set>
#include <queue>
using namespace std;
const int MAX_N = 25;
int n;
char t1[3], t2[3];
int lc[MAX_N], rc[MAX_N];
int root;
set<int> rt;
bool flag;
int last;
void level(int r) {
bool findNull = false;
queue<int> q; q.push(r);
while (!q.empty()) {
int t = q.front(); q.pop();
if (lc[t] == -1) findNull = true;
else {
if (findNull) flag = false;
q.push(lc[t]);
}
if (rc[t] == -1) findNull = true;
else {
if (findNull) flag = false;
q.push(rc[t]);
}
if (q.empty()) last = t;
}
}
int main() {
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
memset(lc, -1, sizeof(lc));
memset(rc, -1, sizeof(rc));
scanf("%d", &n);
for (int i = 0; i < n; i++) rt.insert(i);
for (int i = 0; i < n; i++) {
scanf("%s %s", t1, t2);
if (t1[0] == '-') lc[i] = -1;
else {lc[i] = atoi(t1); rt.erase(atoi(t1));}
if (t2[0] == '-') rc[i] = -1;
else {rc[i] = atoi(t2); rt.erase(atoi(t2));}
}
for (auto it = rt.begin(); it != rt.end(); it++) root = *it;
flag = true; last = -1;
level(root);
if (flag) printf("YES %d\n", last);
else printf("NO %d\n", root);
return 0;
}