将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。
作者
陈越
单位
浙江大学
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
const int max=1<<21;//1左移21位保证数组空间足够大
int arr[max];(c++中const修饰的变量可以作为数组的下标,而c会报错)
int Index, n, x;
void Insert(int* arr,int val,int cur) {
Index = cur > Index ? cur : Index;//记录数组中当前存放二叉搜索元素的最大下标
if (arr[cur] == -1) {
arr[cur] = val;
}
else if (arr[cur] < val) {
Insert(arr, val, 2 * cur);
}
else if (arr[cur] > val) {
Insert(arr, val, 2 * cur+1);
}
}
int main() {
int i;
Index = 0;
memset(arr, -1, sizeof(arr));//将数组元素初始化为-1
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", &x);
Insert(arr, x, 1);
}
int y = Index == n ? 1 : 0;//如果为满二叉搜索树则数组存放节点元素的最大下标与二叉搜索树的元素个数相等
for (i = 1; i <= Index; i++) {
if (arr[i] != -1) {
if (i != 1) {
printf(" ");
}
printf("%d", arr[i]);
}
}
printf("\n%s\n", y ? "YES" : "NO");
system("pause");
return 0;
}
输入格式:
输入第一行给出一个不超过20的正整数N
;第二行给出N
个互不相同的正整数,其间以空格分隔。
输出格式:
将输入的N
个正整数顺序插入一个初始为空的二叉搜索树。在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多余空格。第二行输出YES
,如果该树是完全二叉树;否则输出NO
。
输入样例1:
9
38 45 42 24 58 30 67 12 51
结尾无空行
输出样例1:
38 45 24 58 42 30 12 67 51
YES
结尾无空行
输入样例2:
8
38 24 12 45 58 67 42 51
输出样例2:
38 45 24 58 42 12 67 51
NO