数据结构——堆PTA习题

简介: 数据结构——堆PTA习题

单选题


image.png


选择题题解


1、完全二叉树(深度为 k ,有 n 个结点的二叉树当且仅当其每一个结点都与深度为 k 的满二叉树中编号从 1 至 n 的结点一一对应时,称为完全二叉树。)



满二叉树(堆不保证节点的个数正好能构成满二叉树)


二叉排序树(最小堆只保证父节点比孩子节点小,并不是二叉排序树)


平衡二叉树(二叉平衡树肯定是一颗二叉排序树,堆不是二叉排序树)


3、(5,8,12,19,28,20,15,22)



插入3,3换19再换8再换5


10、是建树后调整序列的规则,是从第【n/2】(个节点最后一个有儿子的节点)向前面的【n/2-1】等节点的顺序进行,可以看作是自底向上、同层自右向左的顺序进行,找同级最大的一层层向上移动。



编程题


堆中的路径 — 用数组建立堆


这个题比较简单,就是用数组建立一个堆,这个堆也是个完全二叉树,所以满足性质:

从1开始的数组中父结点的下标是子结点下标的 int ( i / 2 )


主要操作:


代码中最主要的步骤就是在堆中插入一个元素:


为了满足完全二叉树,我们需要把新的结点先放到最后一个位置,


为了满足最小堆的建立,我们把新的结点进行与父结点比较并调整


我们在与父结点比较时,因为数组的有效结点是从1开始的,我们应该避免与数组的0元素比较


我们可以在0这个下标放一个特别特别小的数


使得在Insert这个操作中,我们不需要单独设置一个条件避免与H[0]比较


而是直接不让H[0]满足H[i / 2] > X这个条件


代码


#include<stdio.h>
#include<stdlib.h>
int H[1001], size;
// 构建最小堆
void Insert(int x)
{
  // 先放到最后一个位置(为了满足二叉树要求),之后再调整其位置(为了满足堆要求)
  int i;
  for (i=++size;H[i/2]>x ;i/=2)
  {
    H[i] = H[i / 2];  // 当父结点比x大时,把x放在父结点位置上   父结点的下到子结点
  }
  H[i] = x;
}
int main()
{
  int n, m, x, i, j;
  scanf("%d %d", &n, &m);
  size = 0;
  H[0] = -10001;  // 设置岗哨,使得每次遍历树的父结点的结束条件变得简单
  for (i = 0; i < n; i++)
  {
    scanf("%d", &x);
    Insert(x);
  }
  for (i = 0; i < m; i++)
  {
    scanf("%d", &j);
    printf("%d", H[j]);
    while (j>1)
    {
      j /= 2;
      printf(" %d", H[j]);
    }
    printf("\n");
  }
  return 0;
}


7-1 关于堆的判断 (25分)


将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种:


x is the root:x是根结点;


x and y are siblings:x和y是兄弟结点;


x is the parent of y:x是y的父结点;


x is a child of y:x是y的一个子结点。


输入格式:


每组测试第1行包含2个正整数N(≤ 1000)和M(≤ 20),分别是插入元素的个数、以及需要判断的命题数。下一行给出区间[−10000,10000]内的N个要被插入一个初始为空的小顶堆的整数。之后M行,每行给出一个命题。题目保证命题中的结点键值都是存在的。


输出格式:


对输入的每个命题,如果其为真,则在一行中输出T,否则输出F。


输入样例:


5 4
46 23 26 24 10
24 is the root
26 and 23 are siblings
46 is the parent of 23
23 is a child of 10


输出样例:


F
T
F
T


代码


#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cstdlib>
#define INF 1000000
using namespace std;
int a[1010], n, m;  // a存堆
// 插入小顶堆
/*
  调整序列的规则 : 是从第【n/2】(个节点最后一个有儿子的节点)向前面的【n/2-1】等节点的顺序进行
*/
int insert(int i) 
{
  int temp;
  while (a[i / 2] > a[i] && i != 1) 
  {
    temp = a[i];
    a[i] = a[i / 2];
    a[i / 2] = temp;
    i = i / 2;  
  }
  return 0;
}
// 找元素的爸爸
int find(int x) 
{
  int p, i;
  for (i = 1; i <= n; i++)
  {
    if (a[i] == x)
      p = i;
  }
  return a[p / 2];
}
// 判断函数
int panduan() 
{
  string str, str1, str2;
  int x, y;
  char ch;
  cin >> x >> str;
  if (str == "and") 
  {
    cin >> y >> str1 >> str2;
    if (find(x) == find(y))   // 兄弟结点就找相同的爸爸就行
      cout << "T" << endl;
    else
      cout << "F" << endl;
    return 0;
  }
  cin >> str;
  if (str == "a") {
    cin >> str1 >> str2 >> y;
    if (find(x) == y)     // x是y的一个子结点。 看x的爸爸是不是y
      cout << "T" << endl;
    else
      cout << "F" << endl;
    return 0;
  }
  cin >> str;
  if (str == "root") {      // x是根结点;   看x是不是第一个
    if (a[1] == x)
      cout << "T" << endl;
    else
      cout << "F" << endl;
    return 0;
  }
  cin >> str1 >> y;
  if (find(y) == x)       // x是y的父结点; 看y的爸爸是不是x
    cout << "T" << endl;
  else
    cout << "F" << endl;
  return 0;
}
int main() 
{
  cin >> n >> m;
  int i, j;
  cin >> a[1];
  for (i = 2; i <= n; i++) 
  {
    cin >> a[i];
    insert(i);//除了第一个节点不用进行插入排序,余下节点都需要进行插入排序
  }
  while (m--) 
  {
    panduan();//对字符串进行对错判断
  }
  return 0;
}
相关文章
|
5天前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
116 75
|
5天前
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
37 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
5天前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
27 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
5天前
|
算法 C++
【C++数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】
【数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】 目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现二叉排序树的基本算法。 相关知识 为了完成本关任务,你需要掌握:二叉树的创建、查找和删除算法。具体如下: (1)由关键字序列(4,9,0,1,8,6,3,5,2,7)创建一棵二叉排序树bt并以括号表示法输出。 (2)判断bt是否为一棵二叉排序树。 (3)采用递归方法查找关键字为6的结点,并输出其查找路径。 (4)分别删除bt中关键
32 11
【C++数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】
|
5天前
|
存储 人工智能 算法
【C++数据结构——图】最短路径(头歌教学实验平台习题) 【合集】
任务描述 本关任务:编写一个程序,利用Dijkstra算法,实现带权有向图的最短路径。 相关知识 为了完成本关任务,你需要掌握:Dijkst本关任务:编写一个程序,利用Dijkstra算法,实现带权有向图的最短路径。为了完成本关任务,你需要掌握:Dijkstra算法。带权有向图:该图对应的二维数组如下所示:Dijkstra算法:Dijkstra算法是指给定一个带权有向图G与源点v,求从v到G中其他顶点的最短路径。Dijkstra算法的具体步骤如下:(1)初始时,S只包含源点,即S={v},v的距离为0。
37 15
|
5天前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
31 12
|
5天前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
31 10
|
5天前
|
算法 C++
【C++数据结构——图】最小生成树(头歌实践教学平台习题) 【合集】
【数据结构——图】最小生成树(头歌实践教学平台习题)目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:【合集】任务描述 本关任务:编写一个程序求图的最小生成树。相关知识 为了完成本关任务,你需要掌握:1.建立邻接矩阵,2.Prim算法。建立邻接矩阵 上述带权无向图对应的二维数组,根据它建立邻接矩阵,如图1建立下列邻接矩阵。注意:INF表示无穷大,表示整数:32767 intA[MAXV][MAXV];Prim算法 普里姆(Prim)算法是一种构造性算法,从候选边中挑
28 10
|
5天前
|
存储 算法 C++
【C++数据结构——图】图的邻接矩阵和邻接表的存储(头歌实践教学平台习题)【合集】
本任务要求编写程序实现图的邻接矩阵和邻接表的存储。需掌握带权有向图、图的邻接矩阵及邻接表的概念。邻接矩阵用于表示顶点间的连接关系,邻接表则通过链表结构存储图信息。测试输入为图的顶点数、边数及邻接矩阵,预期输出为Prim算法求解结果。通关代码提供了完整的C++实现,包括输入、构建和打印邻接矩阵与邻接表的功能。
28 10
|
5天前
|
C++
【C++数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】(1)遇到左括号:进栈Push()(2)遇到右括号:若栈顶元素为左括号,则出栈Pop();否则返回false。(3)当遍历表达式结束,且栈为空时,则返回true,否则返回false。本关任务:编写一个程序利用栈判断左、右圆括号是否配对。为了完成本关任务,你需要掌握:栈对括号的处理。(1)遇到左括号:进栈Push()开始你的任务吧,祝你成功!测试输入:(()))
25 7