数据结构树,二叉树,堆

目录

​编辑

1.树概念及结构

2. 树的表示

3.二叉树概念及结构 

特殊的二叉树

 二叉树的性质

​编辑

二叉树选择题

二叉树的存储结构

4.堆的概念及结构

 父亲孩子下标关系​编辑

 堆的实现接口

堆结构体设计+堆的初始化+堆的销毁

堆的插入(附:向上调整算法)

堆的删除

取堆顶数据+堆的大小+堆的判空


万物皆有裂痕,那是光照进来的地方
 

1.树概念及结构

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

因此,树是递归定义的。

 节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6

叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点
非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G...等节点为分支节点
双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点
孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点
兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点
树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6
节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
树的高度或深度:树中节点的最大层次; 如上图:树的高度为4
堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点
节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先
子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙
森林:由m(m>0)棵互不相交的树的集合称为森林

2. 树的表示

介绍最常用的一种孩子兄弟表示法
(结点指向左孩子,孩子再指向自己的兄弟)
typedef int DataType;
struct Node
{
 struct Node* _firstChild1; // 第一个孩子结点
 struct Node* _pNextBrother; // 指向其下一个兄弟结点
 DataType _data; // 结点中的数据域
};

3.二叉树概念及结构 

一棵二叉树是结点的一个有限集合,该集合 :
1. 或者为空
2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成

1. 二叉树不存在度大于2的结点
2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

 只有一个孩子和没有孩子也可以称为二叉树

特殊的二叉树

满二叉树和完全二叉树

1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。

(每一层都是满的) 

2. 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K 的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对 应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。
(前h-1层都是满的,最后一层可以不满,从左到右是连续的)

 二叉树的性质

二叉树选择题

1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( )
A 不存在这样的二叉树
B 200
C 198
D 199
由性质可知,n0 = n2+1.   n0 = 199+1 = 200
2.在具有 2n 个结点的完全二叉树中,叶子结点个数为( )
A n
B n+1
C n-1
D n/2

首先分析题干,如何求叶子节点的个数?和节点个数相关的公式有二:

n0 = n2 + 1,N = n0 + n1 + n2

已知总个数N为2n,那么只要知道n1即可求出n0.

这里有一个重要的结论:

在完全二叉树中,如果节点总个数为奇数,则没有度为1的节点;如果节点总个数为偶数,只有一个度为1的节点。

2n为偶数,因此有一个度为1的节点。

2n = n0 + 1 + n2 = n0 + 1 + n0 - 1

2n = 2n0

n0 = n,故选A

 

 

3.一个具有767个节点的完全二叉树,其叶子节点个数为()
A 383
B 384
C 385
D 386

本题同上。此时共有奇数个节点,因此没有度为1的节点,即n1 = 0.

由 N = n0 + n1 + n2得: 767 = n0 + 0 + n0 - 1

n0 = 768/2 = 384

4.一棵完全二叉树的节点数位为531个,那么这棵树的高度为( )
A 11
B 10
C 8
D 12

 

把h带进去,10在这个范围里面,所以选B 

二叉树的存储结构

二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。
1. 顺序存储
顺序结构存储就是使用数组来存储,一般使用数组只适合表示 完全二叉树 ,因为不是完全二叉树会有空 间的浪费。而现实中使用 中只有堆才会使用数组来存储 。二叉树顺序存储在 物理上是一个数组,在逻辑上是一颗二叉树。

 

2. 链式存储
二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是 链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所 在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链。
typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
 struct BinTreeNode* _pLeft; // 指向当前节点左孩子
 struct BinTreeNode* _pRight; // 指向当前节点右孩子
 BTDataType _data; // 当前节点值域
}

4.堆的概念及结构

 

 父亲孩子下标关系

 堆的实现接口

堆结构体设计+堆的初始化+堆的销毁
typedef int HPDateType;
typedef struct Heap
{
	HPDateType* a;
	int size;
	int capacity;
}HP;
void HeapInit(HP* php)
{

	php->size = 0;
	php->capacity = 0;

	php->a = NULL;

}
void HeapDestory(HP* php)
{
	free(php->a);
	php->a = NULL;

	php->size = php->capacity = 0;
	
}
堆的插入(附:向上调整算法)

void HeapPush(HP* php, HPDateType x)

{
	//插入进行扩容
	assert(php);

	if (php->size == php->capacity)
	{
		int newcapacity = php->capacity == 0 ? 4 : php->capacity * 2;
		HPDateType* tmp = (HPDateType*)realloc(php->a,sizeof(HPDateType)*newcapacity);
		if (tmp == NULL)
		{
			//判断一下是否开辟失败
			printf("realloc fail\n");
			exit(-1);    //结束程序
		}
		php->a = tmp;
		php->capacity = newcapacity;
	}


	php->a[php->size] = x;
	php->size++;


	//向上调整,从刚刚插入孩子的位置
	Adjustdown(php->a, php->size - 1);
}

向上调整算法

//小堆
void Adjustdown(HPDateType*a, int child)
{
	int parent = (child - 1) / 2;

	while (child>0)
	{
		if (a[child] < a[parent])
		{
			HPDateType* tmp = a[child];
			a[child] = a[parent];
			a[parent] = tmp;

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

}

孩子调整的结束条件是到根结点,跟结点的下标是0,所以大于0就一直调整

堆的删除

 

void HeapPop(HP* php)
{
	assert(php);
	//堆顶和最后一个数据互换
	Swap(&php->a[0], &php->a[php->size - 1]);
	php->size--;

	//从堆顶开始调整,堆顶是下标是0
	AdjustDown(php->a, php->size, 0);
}

向下调整 

void AdjustDown(int* a, int n, int parent)
{
	int child = parent * 2 + 1;
	while (child < n )
	{
		if (child + 1 < n && a[child + 1] < a[child])
		{
			child++;
		}
		if (a[child] < a[parent])
		{
			Swap(&a[child], &a[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}

}

 插入删除的时间复杂度都是o(logN)

取堆顶数据+堆的大小+堆的判空
HPDataType HeapTop(HP* php)
{
	assert(php);
	assert(php->size > 0);
	return php->a[0];
}
int HeapSize(HP* php)
{
	assert(php);
	return php->size;
}
bool HeapEmpty(HP* php)
{
	assert(php);
	return php->size == 0;

}

测试接口

#include"Heap.h"

int main()
{
	HP hp;
	HeapInit(&hp);

	int a[] = { 65, 100, 70, 32, 50, 60 };

	for (int i = 0; i < sizeof(a) / sizeof(int); i++)
	{
		HeapPush(&hp, a[i]);
	}
	return 0;

}

大堆的实现把 < 符号改成>符号即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[多线程]线程安全问题再讨论 - volatile

目录 1.引言 2.volatil关键字 2.1内存可见性 2.2指令重排序 1.引言 大家好,我是老cu,今天我们来继续聊聊线程安全问题 线程安全是我们在编程开发中遇到的非常常见,棘手 的问题.同时也是多线程部分很复杂的问题.为了线程安全我们要做很多努力.也要对线程安全部分的代码进行慎…

计算机网络的分类

目录 一、按照传输介质进行分类 1、有线网络 2、无线网络 二、按照使用者进行分类 1、公用网 (public network) 2、专用网(private network) 三、按照网络规模和作用范围进行分类 1、PAN 个人局域网 2、LAN 局域网 3、MAN 城域网 4、 WAN 广域网 5、Internet 因特…

【算法】直接插入排序

目录 1. 说明2. 举个例子3. java代码示例4. java示例截图 1. 说明 1.直接插入排序的方式和打牌一样&#xff0c;刚开始数组为空 2.拿到一个数字后从左到右将它与数组中的每一个数字进行比较&#xff0c;然后插入合适的位置 3.到最后&#xff0c;数组按照既定的顺序排序好 2. 举…

代码随想录算法训练营第五十三天【动态规划part14】 | 1143.最长公共子序列、1035.不相交的线、53. 最大子序和

1143.最长公共子序列 题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 求解思路 动规五部曲 1.确定dp数组及其下标含义&#xff1a; dp[i][j]&#xff1a;长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序…

Tensorflow的日志log记录

if OUTPUT_GRAPH:tf.summary.FileWriter("logs/", sess.graph)自动创建文件夹log

GEE:Sobel算子卷积和Roberts算子卷积对比

作者:CSDN @ _养乐多_ 本文介绍了Sobel算子卷积和Roberts算子卷积操作的代码,并进行了图像对比,可以观察到两个算子的细微差异。 文章目录 一、Sobel算子和Roberts算子对比二、完整代码三、代码链接一、Sobel算子和Roberts算子对比 详细介绍介绍参考《遥感数字图像处理教程…

基于搜索协议实现工业设备升级

目录 1、背景引入 2、技术分析 3、过程概述 4、服务器端流程 5、客户端流程 6、效果展示 7、源码 7.1 master&#xff08;主控&#xff09; 7.2 device&#xff08;设备&#xff09; 8、注意事项 1、背景引入 在工业生产中&#xff0c;设备的升级和维护是非常重要的…

Gossip 协议

Gossip 协议 背景 在分布式系统中&#xff0c;不同的节点进行数据/信息共享是一个基本的需求。 一种比较简单粗暴的方法就是 集中式发散消息&#xff0c;简单来说就是一个主节点同时共享最新信息给其他所有节点&#xff0c;比较适合中心化系统。这种方法的缺陷也很明显&…

GOLAND搭建GIN框架以及基础框架搭建

创建GO环境文件夹 终端输入安装GIN go get -u github.com/gin-gonic/gin如果遇到超时错误 package golang.org/x/net/html: unrecognized import path "golang.org/x/net/html": https fetch: Get "https://golang.org/x/net/html?go-get1": dial tcp …

理解宏任务和微任务:JavaScript 异步编程的必备知识(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

借助SD地图的BEV静态感知

动机与出发点 纯视觉、视觉Lidar的感知系统在复杂城市道路场景下并不能如预期那般表现稳定&#xff0c;其中遮挡就是一个巨大挑战。现在的BEV静态感知方案多采用多趟重建的方式获取&#xff0c;这就导致无论前方是否有车辆、建筑物、绿化带等&#xff0c;只要能投影到BEV空间的…

1688买家API接口跨境卖家需要的API接口

1688作为深耕产业带多年的数字供应链平台&#xff0c;近两年不仅在年轻消费群体中热度飙升&#xff0c;在跨境侧也有不俗表现。 11月19日&#xff0c;1688总裁余涌在1688跨境寻源通计划发布会上透露&#xff0c;1688平台拥有100万的源头厂商&#xff0c;每年服务6500万的B类买…

【JavaEE】多线程(3) -- 线程等待 wait 和 notify

目录 1. wait()⽅法 2. notify()⽅法 3. notifyAll()⽅法 4. wait 和 sleep 的对⽐&#xff08;⾯试题&#xff09; 由于线程之间是抢占式执⾏的, 因此线程之间执⾏的先后顺序难以预知. 但是实际开发中有时候我们希望合理的协调多个线程之间的执⾏先后顺序. 完成这个协调⼯…

树莓派4B机器狗的串口通信驱动库pyserial实践

pyserial是一个串口通信驱动库&#xff0c;常用的Windows、Linux、MacOS等都可以安装&#xff0c;这里我使用的是树莓派4B来测试&#xff0c;这块板子还是很强大的&#xff0c;我们可以通过pyserial这个库来操作基于这块板子上的机器狗之类的设备。 1、四足机器狗 本人的是四…

初识Java 18-6 泛型

目录 潜在类型机制 支持潜在类型机制的语言 Python的潜在类型机制 C的潜在类型机制 Java中的直接潜在类型机制 潜在类型机制的替代方案 反射 将方法应用于序列中的每个元素 Java 8的潜在类型机制&#xff08;间接实现&#xff09; 潜在类型机制的使用例&#xff08;S…

条款2:不要滥用宏

文章目录 优先选择编译器而不是预编译器两种特殊情况使用宏替代函数调用总结 优先选择编译器而不是预编译器 假设我们预定义了一个宏#define ASPECT_RATIO 1.653&#xff0c;当我们的程序在这个地方出现错误的时候。可能会出现以下的问题&#xff1a; 符号名称ASPECT_RATIO可能…

MQTT客户端、代理(broker)和连接建立

在前篇文章&#xff08;http://t.csdnimg.cn/IamPz&#xff09;中&#xff0c;介绍了发布/订阅架构和MQTT如何据此交换信息&#xff0c;其中的关键概念是&#xff1a; 发布/订阅架构触耦了负责发布信息的客户端&#xff08;发布者&#xff09;和负责接收信息的客户端&#xff…

C语言-联合和枚举

------------------------------------ --------------- ------ 最慢的步伐不是跬步&#xff0c;而是徘徊&#xff1b; 最快的脚步不是冲刺&#xff0c;而是坚持。 今天来到我们的联合和枚举类型的讲解&#xff1a; 目录 联合体类型 联合体类型的声明 联合体类型的特点 …

Wireshark抓包分析RTMP协议时,出现Unknown问题

进行rtmp推流时&#xff0c;使用wireshark抓包&#xff0c;发现部分包显示Unknown 解决方法&#xff1a; 编辑 -> 首选项 -> Protocols -> RTMPT&#xff0c;这里Maximum packet size默认是32768 将该值调大&#xff0c;比如调成1048576&#xff0c;即可解决该问题。…

ChatGPT 的 18 种玩法,你还不会用吗?

你确定&#xff0c;你会使用 ChatGPT 了吗&#xff1f; 今天给大家整理了 18 种 ChatGPT 的用法&#xff0c;看看有哪些方法是你能得上的。 用之前我们可以打开R5Ai平台&#xff0c;可以免费使用目前所有的大模型 地址&#xff1a;R5Ai.com 语法更正 用途&#xff1a;文章…