数据结构之初识树与堆

news2024/10/6 14:33:57

前言:前面学习了顺序表,队列,栈,链表,我们知道他们都是一种线性表,是一种线性结构,而除此之外,仍有许多我们还没认识的结构,比如树形结构,不同于线性结构,树形结构就如同他的名字,结构相对更加复杂,是一种倒着的树的数据结构。

目录

1,什么是树?

2.树的相关概念 

3.树的定义

4.二叉树

 特殊的二叉树:

2.二叉树的存储方式

5.堆

结构体定义与函数接口

堆的初始化

堆的销毁

入堆

向上调整算法

向下调整算法

出堆


1,什么是树?

树是一种非线性的数据结构,它是由n(n>0)个有限节点组成一个具有层次关系的集合,把它叫做书是因为它看起来像一颗倒挂着的树(个人感觉也像树根部的形状),也就是他是根朝上,叶子朝下。

树结构拥有自己的一些独特性质:

.有一个特殊的节点,称为根节点,根节点没有前驱节点

.除根结点外,其余节点被分为M(M>0)个互不相交的集合T1,T2,......Tm,其中每个集合我们可以认为也是一个类似主树的子树,每个子树的节点有且只有一个前驱,可以有0或多个后继节点。

.树是递归定义的,因为它的套娃结构,大树里住着小树。

如下图一根秃了的倒着的树与树结构的对比

 注意:树型结构里面是不能出现子树相交的

不仅仅对于树形结构是这样,树也不能出现一个枝干长到另一个枝干上(可能存在变异)。

2.树的相关概念 

树的某些相关概念是以人类的血缘关系为样例所命名:

我们知道树是一种非线性的数据结构,它是由n(n>=0)个结点的有限集合。

当n=0时称为空树。在任何一棵非空树中:1. 有且只有一个特定的称为 根(root) 的结点;2. 当n>1时,其余结点可分为m(m>0)个 互不相交 的有限集,其中每一个集合又是一棵树,并且成为 根的子树(subtree) 。

结点的度:结点拥有的子树数称为结点的 度(Degree)如上图D的度为3,A度为2.

树的度: 是树内各结点的度的最大值。如D为3

度为0的结点成为 叶节点(Leaf) 或者 终端结点 ,除根结点外,分支结点也称为 内部结点 。如上图的G H I。

结点子树的根称为该结点的 孩子(Child)。如A的孩子B,C

相应的该结点称为孩子的 双亲(Parent) 。如D的双亲为B

同一个双亲之间的孩子之间互称为 兄弟(Sibling)。B与C互为兄弟

结点的 祖先 是指从根到该结点所经历的所有结点.

反之,以该结点为根的子树中的任意一结点称为该节点的 子孙

树的层次:从根开始,根为第一层,根的节点为第二层,以此类推。

树的深度:树中结点的最大层次称为树的 深度(Depth) 或者高度,根据树中结点是否可以交换分为有序树和无序树

堂兄弟节点:双亲在同一层的节点互为堂兄弟。如D,E。

森林 :是指的多棵互不相交的树。

路径和路径长度: 树中两个结点之间的 路径 是由这两个结点之间所经过的结点序列构成的,而 路径长度 是路径上所经过的 边的个数 。

3.树的定义

因为树有很多节点,按照之前的链表他们定义结点的方法,没接触前树我们可能这样定义:

struct TreeNode
{
  int data;
  struct  TreeNode*child1;
  struct  TreeNode*child2;
//......
}

但其实不太可能。人们总结了许多定义树的结构的方法:

1.如果明确了树的度,那么可以定义。(根据树的度来定义节点个数,但是不太能表现树)

2.用顺序表来存放孩子。

struct TreeNode
{
 int data;
 Seqlist   childArr;
}

3.双亲表示法。(每个位置只存储该节点的父节点):用数组存放双亲的下标。

并查集这里就是只存储父亲的下标。

4.左孩子右兄弟方法:比较牛的一种方法,也是一种较优的方法:每一个节点只存放他的第一个孩子节点和下一个兄弟节点。

struct TreeNode

{
   struct TreeNode*firstchid;//第一个孩子节点
   struct TreeNode*nextbrother;//指向下一个兄弟节点
   int data;//节点的数据域
   
}

 对于森林,一般是文件系统结构。

4.二叉树

概念:一种特殊的树的结构,一个二叉树是节点的一个有限集合:

1.要么为空

2.有一个根节点加上两个子树(左右子树)组成。如图:

 我们可以看到:

1.二叉树不存在度大于2的节点

2.二叉树有左右之分,左边的节点叫左孩子,右边的节点叫右孩子,次序不能颠倒,因此是一个有序树。

 特殊的二叉树:

1.满二叉树

概念:一个二叉树,如果每层结点数都达到最大值,那么这个树就是满二叉树。也就是说,如果一个二叉树的层数为K,那么总结点数为,(2^k)-1),等比求和公式可推导出,第N层的节点数为2^(n-1).

2.完全二叉树

概念:相对于满二叉树的最后一行,最后一行不全满,且结点依次从左到右,就是一个完全二叉树。

若一个完全二叉树的层数为k,那么他的k-1层以上的每一层都是满的。

满二叉树是一种特殊的完全二叉树。

若深度为h,节点范围【2^(h-1),2^h-1】.

2.二叉树的存储方式

1.可用二叉链表来表示(有的地方是三叉链表,多了一个结点指向前面的双亲)。

2.可用数组来表示。

 用数组存放右几个优点:

 对于这种存储,比较适合完全二叉树来存储。,因为若有一个双亲没有孩子节点,对于数组这种下表表示双亲存在问题。

5.堆

知道以上的存储方法,对于完全二叉树,有一个叫做堆的结构,堆本质就是一个完全二叉树,

堆分两种:1.大堆    2.小堆

除了是完全二叉树,大堆需满足任何一个双亲都大于等于孩子,对于小堆,任何一个双亲都小于等于孩子。

我们实现堆就用数组来实现的:这里以实现小堆为例

结构体定义与函数接口

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int HPDATAtype;
typedef struct Heap
{
	HPDATAtype *a;
	int size;
	int capacity;
}HP;

void Heapinit(HP* f);
void Heapdestroy(HP* f);
void Heappop(HP* f);
void Heappush(HP* f , HPDATAtype x);

堆的初始化

void Heapinit(HP* f)
{
	//初始有4个空间
	assert(f);
	f->a = NULL;
	f->size = 0;
	f->capacity = 0;
}

堆的销毁

void Heapdestroy(HP* f)
{
	assert(f->a);
	free(f->a);
	f->a = NULL;
}

入堆

void Heappush(HP* f, HPDATAtype x)
{
	assert(f);
	if (f->capacity == f->size)
	{
	int  newcapacity = f->capacity = 0 ? 4 : f->capacity*2;
      HPDATAtype* newnode = (HPDATAtype*)malloc(newcapacity);
	if (newnode == NULL)
	{
		perror("扩容失败\n");
		return;
	}
	f->a = newnode;
	f->capacity = f->capacity*2;
	}
	f->a[f->size] = x;
	f->size++;
	//向上调整算法
	Adjustup(f->a, f->size - 1);
	//向下调整算法
	//Adjustdown(f->a, f->size - 1);
}

在这里在入堆之后,也就是元素赋值到数组之后,根据你对数组的调整,也就是所说的向上调整算法,和向下调整算法,决定是小堆,还是大堆。

向上调整算法

我们这里通过对树所对应的数组元素的关系寻找父亲。

void Adjustup(HPDATAtype*a, int child)
{
	//根据孩子zhaofuqin
	int parent = (child - 1) / 2;
	while (child>0)
	{
		if ( a[child]<a[parent])
		{
		  HPDATAtype p = a[child];
		  a [child] = a[parent];
		  a[parent]=p;

		  child = parent;
		  parent = (child - 1) / 2;
		}
		else 
		{
			break;
		}
		
	}
}

向下调整算法

void Adjustdown(HPDATAtype* a, int child)
{
	//根据孩子找父亲
	int parent = (child - 1) / 2;
	while (child > 0)
	{
		if (a[child] > a[parent])
		{
			int tmp = a[child];
			a[child] = a[parent];
			a[parent] = tmp; 

        child = parent;
		parent = (child - 1) / 2;
		}
		else
		{
			break;
		}
		

	}

}

出堆

出堆就是最后一个元素换到第一个元素,在size--,之后在进行调整。

void Heappop(HP* f){
	assert(f);
	//堆顶元素出堆,最小元素出堆
	assert(f->size);
	int tmp = f->a[0];
	f->a[0] = f->a[f->size - 1];
	f->a[f->size - 1] = tmp;
	f->size--;
	//向上调整
	for (int i = 0; i < f->size; i++)
	{
      Adjustup(f->a, i);
	}
};

堆的应用:

优先级队列的实现     堆排序算法    获取特定范围的值

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

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

相关文章

这个框架真心可以!10分钟就搞定一个网站!

最近有很多小伙伴问我&#xff1a;有没有能快速能搭建网站的框架。 首先我去尝试了低代码&#xff0c;快确实快&#xff0c;但是样式和功能确实差点意思。 偶然间&#xff0c;我发现一款神奇的网站框架:VuePress。 我尝试部署了下&#xff0c;然后一下爱上了它。我发现很多博…

百度飞桨语音PaddleSpeech在win上运行语音识别(ASR)与语音合成(TTS)

百度飞桨语音PaddleSpeech在win上运行语音识别(ASR)与语音合成(TTS) 前言 PaddleSpeech是PaddlePadle百度飞桨深度学习框架下的语音服务工具包。PaddleSpeech包括自监督学习模型、带标点符号的 SOTA/流式 ASR、带文本前端的流式 TTS、说话人验证系统、端到端语音翻译和关键字…

【Scala---01】Scala 基础 『 变量和数据类型 | 控制语句 | 函数式编程』

文章目录 1. 变量和数据类型1.1 变量和常量1.2 字符串1.3 数据类型1.4 伴生对象与伴生类1.5 代码块1.6 Unit、null、Nothing1.7 强制转换1.8 与 equals 2. 控制语句2.1 分支语句2.2 循环语句&#xff08;1&#xff09;for循环&#xff08;2&#xff09;while/do-while循环&…

QT客户端外包开发流程及难点

QT是一种跨平台的C应用程序开发框架&#xff0c;可以用于开发各种类型的客户端软件&#xff0c;包括桌面应用程序、移动应用程序、嵌入式应用程序等。在开发跨平台的客户端语言中&#xff0c;QT应该是应用最广泛的&#xff0c;今天和大家分享开发流程及技术难点&#xff0c;希望…

Consul系列:让服务Running in anywhere

引言 随着微服务概念深入人心&#xff0c;越来越多的解决方案选择使用微服务架构&#xff0c;这类架构的共同点是服务数量多&#xff0c;因此种类繁多的服务之间如何互相访问就变成了一个很现实的问 题。目前比较流行的分布式存储比如:Consul, etcd, ZooKeeper&#xff0c;如何…

【CSS】

目录 1. 什么是 CSS 2. CSS的引入方式 3. CSS 选择器 3.1 基础选择器 3.1.1 标签选择器 3.1.2 类选择器 3.1.3 id 选择器 3.1.4 通配符选择器 3.2 复合选择器 4. CSS 字体设置 5. CSS 文本属性 6. CSS 背景设置 7. CSS 的 display 属性 8. CSS 的盒子模型 9. CSS 的弹…

apple pencil二代平替笔哪个好用?ipad第三方电容笔了解下

近几年来&#xff0c;人们开始使用互联网的频率不断提高&#xff0c;网络教学也日益普及。再加上ipad在所有平板设备中都是数一数二的存在&#xff0c;所以很多人都将它当成了无纸化学习的首选。当然&#xff0c;如果要把 ipad变成一个可以用来学习的东西&#xff0c;那配件肯定…

软件工程实验:数据库设计

前言 本实验的主要内容是数据库设计&#xff0c;即如何根据需求分析&#xff0c;设计合理的数据模型&#xff0c;创建和管理数据库&#xff0c;以及实现数据的增删改查等操作。数据库设计是软件工程的重要组成部分&#xff0c;它涉及到数据的存储、组织、查询和处理等方面&…

JavaWeb-VUEElement综合案例

VUE&Element 今日目标&#xff1a; 能够使用VUE中常用指令和插值表达式能够使用VUE生命周期函数 mounted能够进行简单的 Element 页面修改能够完成查询所有功能能够完成添加功能 1&#xff0c;VUE 1.1 概述 接下来我们学习一款前端的框架&#xff0c;就是 VUE。 Vue 是…

晶圆切割机如何选用切割刀对崩边好

晶圆切割机在切割晶圆时&#xff0c;崩边是一种常见的切割缺陷&#xff0c;影响切割质量和生产效率。要选用合适的切割刀以减少崩边&#xff0c;可以考虑以下几点&#xff1a; 根据晶圆尺寸和切割要求&#xff0c;选择合适的金刚石颗粒尺寸和浓度的切割刀。金刚石颗粒越大&…

十大排序算法(下):计数排序,基数排序,桶排序

文章目录 5. 其他非基于比较的排序5.1 计数排序5.2 桶排序5.3 基数排序 5. 其他非基于比较的排序 5.1 计数排序 有n个数&#xff0c;取值范围是 0~n&#xff0c;写出一个排序算法&#xff0c;要求时间复杂度和空间复杂度都是O(n)的 我们知道&#xff0c;前面介绍的基于比较的排…

javaIO之字符流

目录 一、简介二、字符流入流1.1FileReader构造方法1.2FileReader读取字符数据 三、字符流出流3.1 FileWriter 构造方法3.2FileWriter写入数据3.3关闭close和刷新flush3.4FileWriter的续写和换行3.5文本文件复制 四、IO异常处理五、小结 一、简介 字符流 Reader 和 Writer 的故…

2023最全最细的Selenium+Pytest自动化测试框架实战

选前言# selenium自动化 pytest测试框架 本章你需要 一定的python基础——至少明白类与对象&#xff0c;封装继承 一定的selenium基础——本篇不讲selenium&#xff0c;不会的可以自己去看selenium中文翻译网 测试框架简介# 测试框架有什么优点呢&#xff1a; 代码复用率…

马斯克开造人形AI 变形金刚要成真?

当5个人形机器人迎面走来&#xff0c;你会下意识地期待它们具备怎样的能力。特斯拉最近公布的视频给出答案&#xff0c;它自研的机器人“擎天柱”&#xff08;Optimus&#xff09;能够探索环境&#xff0c;复刻人类动作&#xff0c;自主操纵物品。 特斯拉CEO埃隆马斯克对这些与…

chatgpt赋能Python-python3_4_4怎么打代码

Python3.4.4的入门指南&#xff1a;如何打出高效的Python代码&#xff1f; 作为一名有10年Python编程经验的工程师&#xff0c;我深深地了解到Python3.4.4的强大和灵活性。Python是一种易于学习和使用的编程语言&#xff0c;因此它已成为数据科学家&#xff0c;人工智能和机器…

700页!阿里120W架构师推荐学习的微服务架构解析,到底牛在哪里?

前言 当前&#xff0c;微服务架构在国内正处于蓬勃发展的阶段&#xff0c;无论是大型互联网公司还是传统的IT企业&#xff0c;纷纷采用微服务架构构建系统。 在过去几年里&#xff0c;DevOps、云原生、面向演进式架构等理念已经深入人心&#xff0c;围绕微服务生态也出现了大…

JavaEE(系列9) -- 多线程案列2(堵塞队列)

目录 1. 堵塞队列 2. 生产者消费者模型 2.1 解耦合 2.2 削峰填谷 2.3 代码实现生产者消费者模型 3. 构建堵塞队列 3.1 实现普通队列(循环队列) 3.2 普通队列加上线程安全 3.3 普通队列实现堵塞功能 3.4 堵塞队列最终代码 4. 使用生产者消费者模型测试自己构建的堵塞队列 1. …

IP协议的相关特性、数据链路层相关内容讲解

文章目录 IP协议相关特性地址管理NAT机制IP地址的组成特殊的IP地址 路由选择 数据链路层相关内容以太网MTU IP协议相关特性 首先我们来认识一下IP协议的报头&#xff1a; 4位版本号&#xff1a;指定IP协议的版本&#xff0c;对于IPv4就是4. 4位头部长度&#xff1a;IP头部的长…

每日一题158—— 图片平滑器

图像平滑器 是大小为 3 x 3 的过滤器&#xff0c;用于对图像的每个单元格平滑处理&#xff0c;平滑处理后单元格的值为该单元格的平均灰度。 每个单元格的 平均灰度 定义为&#xff1a;该单元格自身及其周围的 8 个单元格的平均值&#xff0c;结果需向下取整。&#xff08;即…

常用中外文献检索网站大盘点

一、常用中文文献检索权威网站&#xff1a; 1、知网&#xff1a;是全球最大的中文数据库。提供中国学术文献、外文文献、学位论文、报纸、会议、年鉴、工具书等各类资源&#xff0c;并提供在线阅读和下载服务。涵盖领域包括&#xff1a;基础科学、文史哲、工程科技、社会科学、…