题目分析:
本题的要求是将n个数依次插入一个空的二叉搜索树(左大右小,且没有重复数字),最后需要输出其层次遍历以及判断是否是完全二叉搜索树,通过观察我们发现, 如果这个树是用数组建立的,那么最后输出的时候只要按编号从大到小就可以输出层序遍历了,此外,对于是否完全二叉树的判断也可以通过直接判断数组对应的值是否为0即可,需要注意的是由于可能出现极端的情况,这里20个数字可能会占用2^20-1的空间,所以数组需要开大一些
本题代码:
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 using namespace std; 5 6 int k[2500000]; 7 8 void createTree(int gen, int x){ 9 if(k[gen] == 0){ 10 k[gen] = x; 11 return; 12 }else{ 13 if(x > k[gen]) createTree(gen*2, x); 14 else createTree(gen*2+1, x); 15 return; 16 } 17 } 18 19 int main(){ 20 int n; 21 scanf("%d", &n); 22 memset(k, 0, sizeof(k)); 23 for(int i = 1; i <= n; i++){ 24 int x; 25 scanf("%d", &x); 26 createTree(1, x); 27 } 28 int flag = 1; 29 int cnt = 0; 30 int num = 1; 31 for(int i = 1; i <= n; i++) num *= 2; 32 for(int i = 1; i <= num; i++){ 33 if(k[i] != 0){ 34 cnt++; 35 if(cnt > 1) printf(" "); 36 printf("%d", k[i]); 37 }else{ 38 if(cnt < n) flag = 0; 39 } 40 } 41 printf("\n"); 42 if(flag == 1) printf("YES\n"); 43 else printf("NO\n"); 44 return 0; 45 }