浙大版《数据结构学习与实验指导(第2版)》基础实验4-2.5:关于堆的判断

简介: 浙大版《数据结构学习与实验指导(第2版)》基础实验4-2.5:关于堆的判断

题意

将一系列给定数字顺序插人一个初始为空的最小堆 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的一个子结点。

Input

每组测试第1行包含2个正整数N(≤1000)和M(≤20),分别是插入元素的个数以及需要判断的命题数;

下一行给出区间[-10 000, 10 000]内的N个要被插人一个初始为空的小顶堆的整数;

之后M行,每行给出一个命题。题目保证命题中的结点键值都是存在的。


Output

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

思路

首先建堆,然后对每个判断语句找到其在堆中的位置,判断对应的是否成立。

建堆:输入的时候进行调整,因为题目要求最小堆,所以将该节点和父节点比较,如果该节点小于父节点的话就将该节点向上调整,这样最后的数组就满足最小堆的性质啦。

性质:

x的父节点为x/2,子节点为2x,2x+1

判断语句:

首先编写函数get(x)表示得到x在堆里的下标,当然也可以提前用map预处理下。


x is the root,判断x在堆里的下标是否为1

x and y are siblings:判断x和y在堆里的下标的父节点是否相同

x is the parent of y:判断y在堆的下标/2是否为x

x is a child of y:判断x在堆里的下标/2是否为y

代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+7;
#define debug(x) cout<<#x<<":"<<x<<endl;
int n,m,a[maxn];
int get(int x){
    for(int i=1;i<=n;i++)
        if(a[i]==x) return i;
    return -1;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        int now=i;
        while(now>1&&a[now]<a[now/2]){
            swap(a[now],a[now/2]);
            now/=2;
        }
    }
   /// for(int i=1;i<=n;i++) cout<<a[i]<<" ";
   /// puts("");
    while(m--){
        int x,y;string s;
        cin>>x>>s;
        if(s=="and"){  ///x and y are siblings:x和y是兄弟结点。
            cin>>y;
            cin>>s;cin>>s;
            if(get(x)/2==get(y)/2) puts("T");
            else puts("F");
        }
        else{
            cin>>s;
            if(s=="a"){ ///x is a child of y:x是y的一个子结点
                cin>>s;cin>>s;cin>>y;
                if(get(x)/2==get(y)) puts("T");
                else puts("F");
            }
            else{
                cin>>s;
                if(s=="root"){
                    if(get(x)==1) puts("T");
                    else puts("F");
                }
                else{
                    cin>>s>>y;
                    if(get(y)/2==get(x)) puts("T");
                    else puts("F");
                }
            }
        }
    }
    return 0;
}
目录
相关文章
|
2月前
|
存储 算法 Java
散列表的数据结构以及对象在JVM堆中的存储过程
本文介绍了散列表的基本概念及其在JVM中的应用,详细讲解了散列表的结构、对象存储过程、Hashtable的扩容机制及与HashMap的区别。通过实例和图解,帮助读者理解散列表的工作原理和优化策略。
51 1
散列表的数据结构以及对象在JVM堆中的存储过程
|
2月前
|
存储 算法 编译器
数据结构实验之矩阵的运算器(二维数组)
本实验旨在通过团队合作,掌握数组和矩阵相关运算的代码实现,包括矩阵的加减、数乘、转置、乘法、n次方及行列式的计算。实验过程中,成员们需分工协作,解决编程难题,最终实现一个功能完备的矩阵计算器。通过本实验,不仅锻炼了编程能力,还加深了对数学概念的理解,同时培养了团队合作精神。
76 4
|
2月前
数据结构实验之串模式匹配问题
本实验旨在掌握串模式匹配技术,通过创建文本文件、实现单词计数与定位功能,最终构建一个包含文件建立、单词统计与定位、程序退出等选项的主菜单,以增强对字符串处理的理解与应用能力。
71 4
|
2月前
|
算法
数据结构实验之最长公共子序列
本实验旨在通过编程实践帮助学生理解串的基本概念及求解最长公共子序列的算法。实验内容包括使用动态规划方法设计并实现算法,以找出给定两序列的最大公共子序列。示例代码展示了如何通过构建状态矩阵和回溯路径来找到解决方案。实验总结指出,`memset()`函数用于内存初始化,且对于特定输入,程序能正确输出最长公共子序列之一。
66 4
|
2月前
|
算法
数据结构实验之操作系统打印机管理器问题
本实验旨在通过实现操作系统中的打印机管理器问题,掌握队列的基本操作如入队、出队等,利用队列的先进先出特性解决先申请先打印的问题。实验包括队列的初始化、入队、出队、打印队列内容等功能,并通过菜单式界面进行交互。实验结果显示基本功能可正常执行,但在连续操作时存在执行失败的情况,需进一步优化。
57 4
|
2月前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
73 4
|
2月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
2月前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
117 4
|
2月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
72 4
|
2月前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
129 16

热门文章

最新文章

相关实验场景

更多