天梯赛练习 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("\n");
42     if(flag == 1) printf("YES\n");
43     else printf("NO\n");
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("\n");
54     if(flag == 1) printf("YES\n");
55     else printf("NO\n");
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 }

原文地址:https://www.cnblogs.com/findview/p/12264470.html

时间: 2024-08-29 06:36:11

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

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

给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果.于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树. 输入格式: 输入包含若干组测试数据.每组数据的第1行给出两个正整数NNN (≤10\le 10≤10)和LLL,分别是每个序列插入元素的个数和需要检查的序列个数.第2行给出NNN个以空格分隔的正整数,作为初始插入序列.最后LL

04-树4 是否同一棵二叉搜索树 (25 分)

给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果.于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树. 输入格式: 输入包含若干组测试数据.每组数据的第1行给出两个正整数N (≤)和L,分别是每个序列插入元素的个数和需要检查的序列个数.第2行给出N个以空格分隔的正整数,作为初始插入序列.最后L行,每行给出N个插入的元素,属于L个

习题4.3 是否二叉搜索树 (25 分) 浙大版《数据结构(第2版)》题目集

本题要求实现函数,判断给定二叉树是否二叉搜索树. 函数接口定义: bool IsBST ( BinTree T ); 其中BinTree结构定义如下: typedef struct TNode *Position; typedef Position BinTree; struct TNode{ ElementType Data; BinTree Left; BinTree Right; }; 函数IsBST须判断给定的T是否二叉搜索树,即满足如下定义的二叉树: 定义:一个二叉搜索树是一棵二叉树,

二叉搜索树的后序遍历序列——24

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入数组的任意两个数组都互不相同. 二叉搜索树的特点就是每个结点的左子树的值都比自身的值小,而右子树的值都比自身值要大.比如如上的二叉搜索树后序遍历的结果就是{5,7,6,9,11,10,8},但是题意并不是给出一棵二叉搜索树让判断数组是否为后序遍历序列,而是只有一组数据让判断是否为某个二叉搜索树的后序遍历结果,因此之能依据二叉搜索树后序遍历结果的特点来进行分析判断: 就拿上面的结果来说

L2-004 这是二叉搜索树吗? (25 分) (树)

链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805070971912192 题目: 一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点, 其左子树中所有结点的键值小于该结点的键值: 其右子树中所有结点的键值大于等于该结点的键值: 其左右子树都是二叉搜索树. 所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树. 给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其

是否二叉搜索树

6-1 是否二叉搜索树 (25 分) 本题要求实现函数,判断给定二叉树是否二叉搜索树. 函数接口定义: bool IsBST ( BinTree T ); 其中BinTree结构定义如下: typedef struct TNode *Position; typedef Position BinTree; struct TNode{ ElementType Data; BinTree Left; BinTree Right; }; 函数IsBST须判断给定的T是否二叉搜索树,即满足如下定义的二叉树

PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)

L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格式: 输入第一行给出一个不超过20的正整数N:第二行给出N个互不相同的正整数,其间以空格分隔. 输出格式: 将输入的N个正整数顺序插入一个初始为空的二叉搜索树.在第一行中输出结果树的层序

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

L2-004 这是二叉搜索树吗? (25 分) 一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点, 其左子树中所有结点的键值小于该结点的键值: 其右子树中所有结点的键值大于等于该结点的键值: 其左右子树都是二叉搜索树. 所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树. 给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果. 输入格式: 输入的第一行给出正整数 N(≤).随后一行给出 N 个整数键值,其间以空格分隔. 输

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

将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格式: 输入第一行给出一个不超过20的正整数N:第二行给出N个互不相同的正整数,其间以空格分隔. 输出格式: 将输入的N个正整数顺序插入一个初始为空的二叉搜索树.在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多余空格.第二行输出YES,如果该树是完全二叉树:否则输出NO. 输入样例1: 9 38 45 42 24 5