1110. Complete Binary Tree (25)解题报告

来源:互联网 发布:汽车导航怎么链接网络 编辑:程序博客网 时间:2024/05/20 14:27

根结点是唯一没有父亲的结点。

递归还原树的结构。

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;}

0 0
原创粉丝点击