树形结构-数据结构

news2024/9/20 10:58:43
一、基本知识
  1. 树:一对多的树形结构
  2. 顶层的结点:称为根节点
  3. 叶子结点(终端结点):最外围的结点,只有前驱结点,没有后继结点的结点
  4. ,其结点的度是0
  5. 分支结点:分支点是描述数据结构中的从根部出发(对有向图而言)有入度和出度的节点,(对无向图而言)不属于 叶子节点 的节点。 出度不为0的结点称为分枝点。 在 完全m叉树 中,如树叶数为t,分支点数为i,则(m-1)i=t-1。注意实际上就是除了根节点和叶子结点之外的都是。
  • 深度:层数
  • 广度:(默认为度),结点的度最大的结点的度即为树的广度。
  • 结点的度:子节点的个数。(当前结点出发)
二、二叉树

结点的度数不能超过2,或者说度为2的树称为2

满二叉树

在不增加层数的前提下,增加结点,不能增加的树称为满二叉树

每一层的度数2

满二叉树的计算

  1. 第K层节点个数:2 ^(k-1)
  2. K层满二叉树:总共节点个数:2^(k) - 1
  3. 高度计算:满二叉树的高度可以通过节点数和2的幂次关系计算得到。对于有N个节点的满二叉树,其高度H可以表示为H = log2(N+1)。
  4. 查找叶子节点:在满二叉树中,叶子节点的位置可以通过深度和2的幂次关系计算得到。对于深度为d的满二叉树,第i个叶子节点的位置可以表示为i = 2^(d-1)。
  5. 查找非叶子节点:在满二叉树中,非叶子节点的位置可以通过其子节点的位置计算得到。对于第i个非叶子节点,其左子节点的位置为2i,右子节点的位置为2i+1。

完全二叉树

在满二叉树的基础上,要删除结点的话,只能从右至左,从上到下,进行连续按照顺序删除,插入的顺序也是如此。(也就是说,一层一层来,如果上一层没有插完,只能在上面插入)

注意

满二叉树一定是完全二叉树

完全二叉树不一定是满二叉树

三、二叉树的遍历
1、前序遍历

先遍历根节点,再按照前序结点遍历左子树,右子树

顺序:根、左、右,一层一层往进拔清

2、中序遍历

先遍历左子树,再按照前序结点遍历根节点,右子树

顺序:左、根、右

3、后序遍历

先遍历左子树,再按照前序结点遍历右子树,根节点

顺序:左、右、根

前三种称为深度优先

4、层序遍历(广度优先

从上至下,从左至右,逐层遍历

把每一层按照从左到右的顺序进行排列

自我理解

实现,就是增加一个队列,将结点加入,加入之后,再将其的左右子节点的数据。

也就是说一层一层进行入队,只要根结点不为空,那么我们就可以进行打印,出栈结点,出完之后再将其左右结点入队,再循环往复进行操作

注意

  • 只知道其种一个遍历结果没有办法进行还原
  • 已知前序+中序,可以唯一的还原一棵二叉树
  • 后序+中序,可以唯一的还原一棵二叉树
  • 判空并不代表出错方式,而是每一条分支结束的时候的条件
  • 后序最后出现的一定是根
  • 确定一个二叉树实际上就是根据我们结点的出现的特点,两两配合进行创建出唯一一棵确定的二叉树
四、二叉树的算法
1、创建二叉树

char tree[] = {"ABEH###G##CF#D##I##"};
int idx = 0;

TNode_t *create_bin_tree()
{
	TDataType data = tree[idx++];
	if (data == '#')
	{
		return NULL;
	}
	
	TNode_t *pnode = malloc(sizeof(TNode_t));
	if (NULL == pnode)
	{
		perror("fail malloc");
		return NULL;
	}
	pnode->data = data;
	pnode->pl = create_bin_tree();
	pnode->pr = create_bin_tree();
	
	return pnode;
}
2、前序遍历
void pre_order(TNode_t *proot)
{
	if (NULL == proot)
	{
		return;
	}
	printf("%c", proot->data);
	pre_order(proot->pl);
	pre_order(proot->pr);
}
3、中序遍历
void mid_order(TNode_t *proot)
{
	if (NULL == proot)
	{
		return ;
	}
	mid_order(proot->pl);
	printf("%c", proot->data);
	mid_order(proot->pr);
}
4、后序遍历
void pos_order(TNode_t *proot)
{
	if (NULL == proot)
	{
		return ;
	}
	pos_order(proot->pl);
	pos_order(proot->pr);
	printf("%c", proot->data);
}
5、层序遍历
void layer_order(TNode_t *proot)
{
	QDataType outdata;
	Queue_t *pque = create_queue();	
	if (NULL == pque)
	{
		printf("fail create_queue\n");
		return ;
	}

	push_queue(pque, proot);

	while (!is_empty_queue(pque))
	{
		pop_queue(pque, &outdata);
		printf("%c", outdata->data);
		if (outdata->pl != NULL)
		{
			push_queue(pque, outdata->pl);
		}
		if (outdata->pr != NULL)
		{
			push_queue(pque, outdata->pr);
		}
	}

	destroy_queue(pque);
}

6、计算结点个数
int get_tree_node_cnt(TNode_t *proot)
{
	if (NULL == proot)
	{
		return 0;
	}
	return get_tree_node_cnt(proot->pl)+get_tree_node_cnt(proot->pr)+1;
}
7、计算层数
int get_tree_layer_cnt(TNode_t *proot)
{
	if (NULL == proot)
	{
		return 0;
	}
	int cntl = get_tree_layer_cnt(proot->pl);
	int cntr = get_tree_layer_cnt(proot->pr);

	return cntl > cntr ? cntl + 1 : cntr + 1;
}
8、销毁树
void destroy_tree(TNode_t *proot)
{
	if (NULL == proot)
	{
		return ;
	}
	destroy_tree(proot->pl);
	destroy_tree(proot->pr);
	free(proot);
}

五、程序在书写过程中遇到的问题

为在预编译指令进行解析的时候,会在这里来回跳转包含

头文件推迟包含,哪里需要哪里包,否则会头文件进行包含重复

为了防止,头文件中你中有我,我中有你的问题,还是哪里需要哪里包含即可

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

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

相关文章

金山在线文档编辑器

官方文档地址:快速开始-WebOffice 知识库 首先按照文档写的方式将包引入项目了 util.js import WebOfficeSDK from "../../public/JSEditor/open-jssdk-v0.0.13.umd" export function WordSDK(url, isEdit, mountDom, isShowTopArea, isShowHeader) {c…

【HTML】HTML页面和常见标签

文章目录 什么是前端HTML 页面编写如何快速生成代码框架常见标签注释标签标题标签段落标签换行标签格式化标签 什么是前端 Web 前端,用来直接给以用户呈现的一个一个的网页。一个软件通常是由 后端前端 完成的 后端:通过 Java/C等语言,完成相…

机械厂选并联电容器的要求

在机械厂选择并联电容器时,需要考虑多个因素,以确保无功补偿设备能够有效提高功率因数、降低电网损耗、提升电能质量。以下是机械厂选用并联电容器时的一些关键要求: 1、容量选择 无功功率需求:根据机械厂的负载特性,…

Apple公众号,是如何玩转SVG擦出/刷新/填涂特效?|E2.COOL黑科技SVG编辑器

动画类型 width/height animation 通过擦出/刷新等效果,实现产品的多图轮播、细节对比、文字高亮——这是 Apple 公众号特别偏爱的一种 SVG 交互设计方式。那么它的技术本质是什么?Apple 的编辑又是如何持续创新应用在 SVG 图文内的?本期我…

【Python】谷歌浏览器总是自动更新,使用selenium跟chromedriver版本不匹配怎么办?

我发现,我的电脑对谷歌浏览器的禁止自动更新无效,哪怕是在任务计划程序里,禁止谷歌浏览器更新,也没有用。而且有时候点开右上角的三个点,也会自动更新版本。 但是往往chromedriver的更新版本更不上浏览器的版本哇&…

SQL Server数据库简单的事务日志备份恢复

模拟数据库备份恢复过程 1.基础操作 1.创建TestDB数据库,并添加数据 USE [master] GO CREATE DATABASE TestDB CONTAINMENT NONE ON PRIMARY ( NAME NTestDB, FILENAME ND:\TestDB.mdf , SIZE 8192KB , MAXSIZE UNLIMITED, FILEGROWTH 65536KB ) LOG ON ( …

前端开发人员都必须知道的 7 个 Vue3 组件库!

Vue.js 是一个流行的 JavaScript 框架,它以其易用性和灵活性吸引了大量开发人员。 随着 Vue 3 的发布,生态系统也迎来了新的变化和增强。 本文将介绍每个前端开发人员都必须知道的 7 个 Vue 3 组件库,并提供详细步骤、代码示例和相关图片链…

编译原理/软件工程核心概念-问题理解

目录 1.程序的编译执行过程 2.指针和引用的区别 3.堆和栈的区别 4.最熟悉的编程语言- Python:介绍PyTorch和TensorFlow框架 5.C与C的区别 6.软件工程是什么? 7.简述瀑布模型 8.敏捷开发方法是什么?它与瀑布模型相比有哪些优势和劣势 1…

Python 数学建模——高斯核密度估计

文章目录 前言原理代码实例scipy 实现seaborn 实现 前言 高斯核密度估计本是一种机器学习算法,在数学建模中也可以发挥作用。本文主要讨论用它来拟合变量的概率密度,获得概率密度函数 f ( x ) f(x) f(x)。 原理 已知一个连续型随机变量 X X X 的一系列…

实战千问2大模型第三天——Qwen2-VL-7B(多模态)视频检测和批处理代码测试

画面描述:这个视频中,一位穿着蓝色西装的女性站在室内,背景中可以看到一些装饰品和植物。她双手交叉放在身前,面带微笑,似乎在进行一场演讲或主持活动。她的服装整洁,显得非常专业和自信。 一、简介 阿里通义千问开源新一代视觉语言模型Qwen2-VL。其中,Qwen2-VL-72B在大…

Kubernetes部署(haproxy+keepalived)高可用环境和办公网络打通

HAProxy Keepalived 部署高可用性入口: 部署两台或多台节点运行 HAProxy 作为负载均衡器。使用 Keepalived 实现 VIP(虚拟 IP),为 HAProxy 提供高可用性。Keepalived 会监控 HAProxy 的状态,如果主节点失效&#xff0…

再次进阶 舞台王者 第八季完美童模全球赛荣耀大使【殷淑窈】赛场秀场超燃合集!

7月20-23日,2024第八季完美童模全球总决赛在青岛圆满落幕。在盛大的颁奖典礼上,一位才能出众的少女——殷淑窈,迎来了她舞台生涯的璀璨时刻。 荣耀大使——殷淑窈,以璀璨童星之姿,优雅地踏上完美童模盛宴的绚丽舞台&am…

51单片机应用开发---二进制、十六进制与单片机寄存器之间的关系(跑马灯实例)

实现目标 1、掌握二进制与十六进制之间的转换 2、掌握单片机寄存器与二进制、十六进制之间的转换 一、二进制与十六进制之间的转换 1、二进制 二进制(binary), 是在数学和数字电路中以2为基数的记数系统,是以2为基数代表系统…

Java面试篇基础部分-Java中的集合类

Java集合是面试中经常被问到的一块内容,很多人在这个地方被面试官吊打。Java集合类被定义在java.util包中,主要有四种集合,分别是List、Queue、Set和Map,每种集合分类如下图所示 List集合 List是一种在开发中比较常用的集合类,作为有序的Collection的典范,分别有如下的…

股指期货的指数一直贴水是什么意思?

在投资的世界里,股指期货是一个既复杂又充满机会的领域。而“股指期货贴水”这一现象,更是让不少投资者感到困惑。今天,我们就用大白话,来详细解释一下股指期货贴水到底是什么意思。 一、什么是股指期货? 首先&#…

ppt一键生成软件免费版有哪些?职场小白看这里

俗话说得好:时间就是金钱,一款好用且高效的工具无疑能让我们的工作事半功倍。 特别是经常需要制作ppt的朋友,拥有ppt一键生成软件免费工具可以帮你们更高效的完成工作,将精力投入到其他事项去。 因此,今天这篇文章找…

虚拟电厂高质量发展,大众氢能港引领能源管理新变革

在2024年这个充满希望的夏日,上海市政府正式印发了《上海市虚拟电厂高质量发展工作方案》,标志着上海在探索能源结构优化、促进绿色低碳发展的道路上迈出了坚实的一步。该方案不仅为虚拟电厂的未来发展绘制了清晰的蓝图,更通过一系列创新举措…

Github 2024-09-09 开源项目周报 Top15

根据Github Trendings的统计,本周(2024-09-09统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目6TypeScript项目4Jupyter Notebook项目2C++项目2JavaScript项目2Shell项目1Dockerfile项目1C#项目1Dart项目1Rust项目1Microsoft Pow…

大健康企业如何通过私域流量与积分增值模式实现业绩飞跃

在探讨大健康领域的一家创新企业时,我们发现其成功之路并非仅仅依赖传统电商的广撒网策略,如大规模广告投放和促销优惠,而是巧妙转型,深耕私域流量的构建与独特商业模式的应用。 这一转变不仅显著提升了月度销售业绩,更…

不小心把电脑格式化了怎么恢复?这些步骤帮你找回数据

在日常使用电脑的过程中,我们有时会因为各种原因不小心对电脑进行了格式化操作。一旦电脑被格式化,所有的数据都将被清除,这给用户带来了巨大的困扰和损失。 然而,不必过于绝望,因为有些方法可以帮助我们恢复被格式化…