【数据结构篇】~二叉树(堆)

news2024/9/22 19:44:31

【数据结构篇】~二叉树(堆)

  • 二叉树
    • 1.树
    • 2.树的组成
    • 3.二叉树
    • 4.堆
      • 1.向上调整算法
      • 2.向下调整算法
      • 3.堆排序
    • 4.topk问题
      • 源码

二叉树

1.树

树的概念与结构​
树是一种非线性的数据结构,它是由 n(n>=0) 个有限结点组成一个具有层次关系的集合。把它叫做
树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
在这里插入图片描述

• 有一个特殊的结点,称为根结点,根结点没有前驱结点。
• 除根结点外,其余结点被分成 M(M>0) 个互不相交的集合 T1、T2、……、Tm ,其中每一个集合

Ti(1 <= i <= m) 又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有 0 个或多个后继。因此,树是递归定义的。
树形结构中,子树之间不能有交集,否则就不是树形结构
非树形结构:
• 子树是不相交的(如果存在相交就是图了,图以后得课程会有讲解)
• 除了根结点外,每个结点有且仅有一个父结点
• 一棵N个结点的树有N-1条边​

2.树的组成

父结点/双亲结点:若一个结点含有子结点,则这个结点称为其子结点的父结点; 如上图:A是B的父
结点
子结点/孩子结点:一个结点含有的子树的根结点称为该结点的子结点; 如上图:B是A的孩子结点
结点的度:一个结点有几个孩子,他的度就是多少;比如A的度为6,F的度为2,K的度为0​
树的度:一棵树中,最大的结点的度称为树的度; 如上图:树的度为 6 ​
叶子结点/终端结点:度为 0 的结点称为叶结点; 如上图: B、C、H、I… 等结点为叶结点​
分支结点/非终端结点:度不为 0 的结点; 如上图: D、E、F、G… 等结点为分支结点​
兄弟结点:具有相同父结点的结点互称为兄弟结点(亲兄弟); 如上图: B、C 是兄弟结点​
结点的层次:从根开始定义起,根为第 1 层,根的子结点为第 2 层,以此类推;
树的高度或深度:树中结点的最大层次; 如上图:树的高度为 4 ​
结点的祖先:从根到该结点所经分支上的所有结点;如上图: A 是所有结点的祖先
路径:一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列;比如A到Q的路径为:
A-E-J-Q;H到Q的路径H-D-A-E-J-Q
子孙:以某结点为根的子树中任一结点都称为该结点的子孙。如上图:所有结点都是A的子孙​
森林:由 m(m>0) 棵互不相交的树的集合称为森林;

3.二叉树

在这里插入图片描述
在这里插入图片描述

💡 二叉树性质
根据满二叉树的特点可知:
1)若规定根结点的层数为 1 ,则一棵非空二叉树的第i层上最多有​2 个结点​
i−1
2)若规定根结点的层数为 1 ,则深度为 h 的二叉树的最大结点数是​2 − ​
h 1
3)若规定根结点的层数为 1 ,具有 n 个结点的满二叉树的深度​ ( log
以2为底, n+1 为对数)​

4.堆

1.向上调整算法

在这里插入图片描述

💡 向上调整算法
• 先将元素插入到堆的末尾,即最后一个孩子之后​
• 插入之后如果堆的性质遭到破坏,将新插入结点顺着其双双亲往上调整到合适位置即可

2.向下调整算法

在这里插入图片描述

💡 向下调整算法
• 将堆顶元素与堆中最后一个元素进行交换
• 删除堆中最后一个元素
• 将堆顶元素向下调整到满足堆特性为止

3.堆排序

在这里插入图片描述

4.topk问题

源码

void createNdate()
{
	// 造数据
	int n = 100000;
	srand(time(0));
	const char* file = "data1.txt";
	FILE* fin = fopen(file, "w");
	if (fin == NULL)
	{
		perror("fopen error");
		return;
	}
	for (int i = 0; i < n; ++i)
	{
		int x = (rand() + i) % 1000000;//(范围0~999999)
		fprintf(fin, "%d\n", x);
	}
	fclose(fin);
}

void top_k()//(找n个数据中前k个最大的(建小堆))
{
	createNdate();
	//1.先读文件
	//2.创建k大的数组
	//3.用这个数组建堆
	//4.读剩下的n-k个数据与堆顶数据比较,
	// 大的与堆顶数据交换,交换后再调整,直到把剩下的n-k个数据遍历完
	//5.关闭文件
	int k = 0;
	printf("请输入 k:");
	scanf("%d",&k);
	//第一步
	const char* file = "data1.txt";
	FILE* fout = fopen(file, "r");
	if (fout == NULL)
	{
		perror("fopen error");
		return;
	}
	//第二步
	int* minheap =(int*)malloc(sizeof(int)*k);
	if (minheap == NULL)
	{
		perror("malloc fail!");
		return;
	}

	//第三步(取数据建堆)
	for (int i = 0; i < k; i++)
	{
		fscanf(fout, "%d", &minheap[i]);
	}
	for (int i = (k - 1 - 1)/2;i>=0;i--)
	{
		adjustdown(minheap,k,i);
	}
	//第四步
	int x = 0;//先将取出的数据存到x
	while (fscanf(fout, "%d", &x) != EOF)
	{
		if (x > minheap[0])
		{
			minheap[0] = x;
			adjustdown(minheap, k, 0);
		}
	}
	for (int i = 0; i < k; i++)
	{
		printf("%d ", minheap[i]);
	}
	fclose(fout);

}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2071736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用“2+1链动模式小程序AI智能名片S2B2C商城源码”优化企业参与外部社群策略

摘要&#xff1a;在当今数字化时代&#xff0c;企业参与外部社群已成为其市场扩张、品牌塑造及用户增长不可或缺的一环。然而&#xff0c;面对浩如烟海的社群类型&#xff0c;包括行业论坛、地区性论坛、特定兴趣爱好的论坛以及短视频网站等&#xff0c;如何精准选择并有效介入…

16.C基础_内存管理

内存分区 1、整体框图 内存分为代码区、全局区、栈区、堆区。代码区和全局区在代码编译完之后就已经确定&#xff0c;栈区和堆区是在程序运行时进行开辟和释放的。整体内存分区框图如下&#xff1a; 对于一个进程&#xff0c;它一共有4G的空间&#xff0c;其中0~3G为上述的4个…

Flask+LayUI开发手记(三):LayUI表格的后端数据分页展现

前几天写了数据表格table的前端分页展现&#xff0c;思路是把数据一次性取到前端&#xff0c;然后由前端来控制分页展现。这种做法主要目的是为了降低后端数据库读写的次数减轻服务端运行压力。但是&#xff0c;如果功能不单是查询还要进行增删改操作&#xff0c;那么一次数据提…

自制项目镜像并拉取

1.先把项目jar包拉到Linux上看能用不 mvn clean package cd target java -jar shared_battery-0.0.1-SNAPSHOT.jar 成功&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&…

24-8-24-读书笔记(十五)-《空谷幽兰》([法] 巴尔扎克 [译] 李玉民 )

文章目录 《空谷幽兰》&#xff08;[法] 巴尔扎克 [译] 李玉民 &#xff09;阅读笔记记录&#xff08;P112-P126&#xff09;总结 《空谷幽兰》&#xff08;[法] 巴尔扎克 [译] 李玉民 &#xff09; 《空谷幽兰》巴尔扎克最为得意的作品&#xff0c;这篇主要记录一个德莫尔索夫…

SSRF漏洞实现

文章目录 SSRF题1SSRF题2fastcgi方法 入侵网站收集资产方法SSRF反弹 SSRF题1 漏洞复现平台 代码&#xff1a; 首先&#xff0c;可以用dict探测一下内网开放的端口 可以检测是否有fastcgi或者是redis&#xff0c;如果有fastcgi&#xff0c;那么就有RCE漏洞破解&#xff0c;如…

Adobe Animate (AN)软件安装,硬件配置(附安装包)

目录 一、Adobe An 软件简介 Adobe An 软件的特点 Adobe An 软件的优势 下载 二、Adobe An 软件安装 安装前的准备工作 安装过程中的注意事项 安装后的设置 三、Adobe An 软件使用 高级动画技巧 交互设计 优化与性能提升 四、Adobe An 软件快捷键 选择工具快捷键…

专业级推荐:2024年硬盘数据恢复软件全攻略

硬盘作为我们存储珍贵数据、工作文档、家庭照片以及个人视频的核心载体&#xff0c;其重要性不言而喻。然而&#xff0c;随着使用时间的增长或是操作不当硬盘可能会遭遇损坏。遇到这种问题我们要怎么挽救自己的数据呢&#xff0c;这次我就来分享下我用过的硬盘数据恢复软件。 …

基于Netty的RPC框架

RPC远程过程调用(Remote Procedure Call)是一种通信协议&#xff0c;它允许程序调用位于不同地址空间&#xff08;通常是网络上的另一台机器&#xff09;的方法&#xff0c;而无需程序员显式编码这个远程调用的细节。这种技术隐藏了底层的通讯细节&#xff0c;使得调用远程服务…

中国数据库的崛起:从本土化挑战到全球化机遇

引言 谈起中国的崛起&#xff0c;大家第一反应可能是“中国制造”“高铁奇迹”“电商帝国”&#xff0c;但今天我们要聊的&#xff0c;是一个比这些还要神秘的存在——中国的数据库技术。或许你平时并不会经常关注它&#xff0c;但这个隐身在你手机、电脑、服务器背后的无形力…

Towards Enriched Controllability for Educational Question Generation

文章目录 题目摘要引言生成显式和隐式问题实验设置结果基线结论 题目 迈向教育问题生成的丰富可控性 论文地址:https://arxiv.org/abs/2306.14917 摘要 问题生成 (QG) 是自然语言处理 (NLP) 中的一项任务&#xff0c;涉及根据输入自动生成问题&#xff0c;输入通常由文本和目标…

在进行网站链接时,‌加上http或https的重要性不言而喻

这一简单的操作背后&#xff0c;‌蕴含着对搜索引擎优化&#xff08;‌SEO&#xff09;‌的深刻理解&#xff0c;‌以及对网站权重提升的精准把握。‌以下&#xff0c;‌我们将深入探讨这一话题&#xff0c;‌以期为您的网站优化提供有价值的参考。‌优化&#xff08;‌SEO&…

即时通讯IM软件推荐:五款适合企业内部使用的IM即时通讯软件

随着企业的不断发展&#xff0c;内部沟通和协作变得尤为重要。为了提高沟通效率、加强团队协作以及促进信息共享&#xff0c;企业需要选择适合自身需求的即时通讯IM软件。本文将为大家推荐五款适合企业内部使用的IM即时通讯软件&#xff0c;其中包括了备受赞誉的WorkPlus。 Wor…

SPSS和MATLAB实现【典型相关分析】

典型相关分析&#xff08;Canonical Correlation analysis &#xff09;&#xff0c;是用于研究 两组 变量&#xff08;每组变量中都可能有多个指标&#xff09; 之间相关关系的一种多元统计方法。它能够揭示出两组变量之间的内在联系。 我们之前总结的相关性分析&#xff0c;也…

libtorch学习历程(二):张量

libtorch(pytorch c)的大多数api和pytorch保持一致。 使用之前要导入torch #include <torch/torch.h> #include <torch/script.h> 1. 张量初始化 1.1 固定的值与尺寸 在C中&#xff0c;使用{}来表示尺寸 zeros() zeros()产生值全为0的张量。 // 得到一个三维…

Java数据结构篇

Map体系 1.HashMap 哈希冲突&#xff1a;开放定址法、再哈希法、链地址法插入元素先检查是否到达阈值&#xff0c;是则先数组扩容&#xff0c;然后再插入链表&#xff0c;链表长度超过8则转红黑树1.7之前由于扩容导致的头插法尾插法混合导致指针错误&#xff0c;出现死循环问…

[底层原理] C/C++获取时间(将时间戳转换为年月日)?

前言 大家都知道&#xff0c;计算机中存储的时间是一个整数&#xff0c;在现在的编程语言中&#xff0c;可以很方便地将时间戳&#xff08;整数&#xff09;转换为字符串&#xff0c;但是如果没有这些我们该如何自己计算出呢&#xff1f; 刚好以前研究过Nginx的源代码&#xff…

docker系列12:Dockerfile实战

传送门 docker系列1&#xff1a;docker安装 docker系列2&#xff1a;阿里云镜像加速器 docker系列3&#xff1a;docker镜像基本命令 docker系列4&#xff1a;docker容器基本命令 docker系列5&#xff1a;docker安装nginx docker系列6&#xff1a;docker安装redis docker系…

红黑树、B+Tree、B—Tree

红黑树 B-Tree 这三个通常都是把内存全部加载到内存里&#xff0c;然后再内存中进行处理的&#xff0c;数据量通常不会很大。 内存一般容量都在GB级别&#xff0c;比如说现在常见的4G、8G或者16G。 如果要处理的数据规模非常大&#xff0c;大到内存根本存不下的时候。这个时候…

基于微信小程序靓丽内蒙古APP(源码+定制+辅导)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…