根结点是唯一没有父亲的结点。
递归还原树的结构。
n结点完全二叉树用数组表示时,正好连续占据数组前n个位置。
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstdlib>
#include <cstring>
struct node {
int left, right;
};
void recovery(node arr1[], int n, int arr2[], int index1, int index2);
int findroot(node arr[], int n);
int main(void)
{
int n, i, root;
char str1[10], str2[10];
scanf("%d", &n);
int *arr1 = (int *)calloc(n, sizeof(int));
node *arr2 = (node *)calloc(n, sizeof(node));
for (i = 0; i < n; i++) {
arr1[i] = -1;
scanf("%s %s", str1, str2);
if (strcmp(str1, "-")) {
arr2[i].left = atoi(str1);
}
else {
arr2[i].left = -1;
}
if (strcmp(str2, "-")) {
arr2[i].right = atoi(str2);
}
else {
arr2[i].right = -1;
}
}
root = findroot(arr2, n);
recovery(arr2, n, arr1, root, 0);
bool flag = true;
for (i = 0; i < n; i++) {
if (arr1[i] == -1) {
flag = false;
break;
}
}
if (flag) {
printf("%s %d\n", "YES", arr1[n - 1]);
}
else {
printf("%s %d\n", "NO", arr1[0]);
}
delete[] arr1;
delete[] arr2;
return 0;
}
void recovery(node arr1[], int n, int arr2[], int index1, int index2)
{
if (index1 > -1 && index2 < n) {
arr2[index2] = index1;
recovery(arr1, n, arr2, arr1[index1].left, index2 * 2 + 1);
recovery(arr1, n, arr2, arr1[index1].right, index2 * 2 + 2);
}
return;
}
int findroot(node arr[], int n)
{
bool flag = false, *hasparent = (bool *)calloc(n, sizeof(bool));
int i;
for (i = 0; i < n; i++) {
if (arr[i].left >= 0) {
hasparent[arr[i].left] = true;
}
if (arr[i].right >= 0) {
hasparent[arr[i].right] = true;
}
}
for (i = 0; i < n; i++) {
if (!hasparent[i]) {
break;
}
}
delete[] hasparent;
return i;
}