题目来源:PAT甲级 1110 Complete Binary Tree
#include <bits/stdc++.h>
using namespace std;
struct node {
int l, r;
int key;
} tree[25];
int root, lastNode;
bool IsCompleteBinaryTree() { // 验证是否为完全二叉树
bool flag = false;
queue<int> q;
q.push(root);
int cur;
while (!q.empty()) {
cur = q.front();
q.pop();
if (tree[cur].l == -1 && tree[cur].r != -1) { // 若左孩子为空,且右孩子不为空,则不是完全二叉树
return false;
}
if (flag) {
if (!(tree[cur].l == -1 && tree[cur].r == -1)) { // 出现右孩子为空(flag = true),接下来的节点应为叶子节点,否则不是完全二叉树
return false;
}
}
if (tree[cur].r == -1) {
flag = true;
}
if (tree[cur].l != -1) {
q.push(tree[cur].l);
}
if (tree[cur].r != -1) {
q.push(tree[cur].r);
}
if (q.empty()) { // 队列为空,当前节点为最后一个节点
lastNode = tree[cur].key;
}
}
return true;
}
int getNum(string &s){
if(s[0] == '-'){ // 空节点设为-1
return -1;
}
int num = 0;
for(int i = 0; i < s.length(); i++){ // 注意两位以上的数
num = num * 10 + s[i] - '0';
}
return num;
}
int main() {
int n;
string l, r;
cin >> n;
vector<bool> isRoot(n, tree);
for (int i = 0; i < n; ++i) {
cin >> l >> r;
tree[i].l = getNum(l);
tree[i].r = getNum(r);
tree[i].key = i;
if(tree[i].l != -1){
isRoot[tree[i].l] = false;
}
if(tree[i].r != -1){
isRoot[tree[i].r] = false;
}
}
for (int j = 0; j < n; ++j) { // 找根节点
if (isRoot[j] == true) {
root = j;
break;
}
}
if (IsCompleteBinaryTree()) {
cout << "YES" << " " << lastNode << endl;
} else {
cout << "NO" << " " << root << endl;
}
return 0;
}