天梯赛练习 L3-010 是否完全二叉搜索树 (30分) 数组建树模拟

Posted findview

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了天梯赛练习 L3-010 是否完全二叉搜索树 (30分) 数组建树模拟相关的知识,希望对你有一定的参考价值。

题目分析:

本题的要求是将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("
"); 
42     if(flag == 1) printf("YES
");
43     else printf("NO
");
44     return 0;
45 }

 由链式建树代码:

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<queue>
 5 using namespace std;
 6 
 7 int cnt, n;
 8 
 9 struct Node{
10     int data;
11     Node* left;
12     Node* right;
13 }*root;
14 
15 Node* createTree(Node* root, int x){
16     if(root == NULL){
17         root = new Node();
18         root->data = x;
19         root->left = NULL;
20         root->right = NULL;
21         return root;
22     }
23     if(x > root->data) root->left = createTree(root->left, x);
24     else root->right = createTree(root->right, x);
25     return root;
26 }
27 
28 void run(Node* root){
29     queue<Node*> q;
30     cnt = 1;
31     q.push(root);
32     int flag = 1;
33     while(!q.empty()){        //有节点就有数字需要输出 
34         Node* t = q.front();
35         q.pop();
36         if(cnt > 1) printf(" ");
37         printf("%d", t->data);
38         if(t->left){
39             q.push(t->left);
40             cnt++;
41         } 
42         else{
43             if(cnt < n) flag = 0;
44         }
45         if(t->right){
46             q.push(t->right);    
47             cnt++;
48         } 
49         else{
50             if(cnt < n) flag = 0;
51         }
52     }
53     printf("
");
54     if(flag == 1) printf("YES
");
55     else printf("NO
");
56 }
57 
58 int main(){
59     scanf("%d", &n);
60     for(int i = 1; i <= n; i++){
61         int x;
62         scanf("%d", &x);
63         root = createTree(root, x);
64     }    
65     run(root);
66     return 0;
67 }

 

以上是关于天梯赛练习 L3-010 是否完全二叉搜索树 (30分) 数组建树模拟的主要内容,如果未能解决你的问题,请参考以下文章

L3-010. 是否完全二叉搜索树

2021-4-4天梯赛训练赛1补题(是否完全二叉搜索树 (30 分))

PTA L2-004 这是二叉搜索树吗?-判断是否是对一棵二叉搜索树或其镜像进行前序遍历的结果 团体程序设计天梯赛-练习集

PAT 天梯赛 是否同一棵二叉搜索树   (25分)(二叉搜索树)

天梯 - 是否完全二叉搜索树(判断序列插完是否是完全二叉树,并求出层序遍历)

天梯赛赛前热身