数据结构详细笔记——树

news2024/11/16 7:21:39

文章目录

    • 树的定义和基本术语
      • 结点、树的属性描述
      • 有序树与无序树
      • 树与森林
    • 树的常考性质
    • 树的存储结构
      • 双亲表示法(顺序存储)
      • 孩子表示法(顺序+链式存储)
      • 孩子兄弟表示法(链式存储)
    • 树和森林的遍历
      • 树的遍历
      • 森林的遍历
    • 哈夫曼树
      • 哈夫曼树的基础术语
      • 哈夫曼树的定义
      • 哈夫曼树的构造


树的定义和基本术语

树是n(n>=0)个结点的有限集合,n=0时,称为空树,这是一种特殊情况。在任意一棵非空树中应满足:
1、有且仅有一个特定的称为根的结点
2、当n>1时,其余结点可分为m(m>0)个互不相交的有限集合,其中每一个集合本身又是一棵树,并且称为根结点的子树。

结点、树的属性描述

1、结点的层次(深度)————从上往下数
2、结点的高度————从下往上数
3、树的高度(深度)————总共多少层
4、结点的度————有几个孩子(分支)
5、树的度————各结点的度的最大值

有序树与无序树

有序树——逻辑上看,树中结点的各子树从左至右是有次序的,不能互换
无序树——逻辑上看,树中结点的各子树从左至右是无次序的,可以互换
注意:具体看你的树存什么,是否需要用结点的左右位置反映某些逻辑关系

树与森林

森林——森林是m(m>=0)棵互不相交的树的集合
m可为0:空森林

树的常考性质

1、结点数 = 总度数 + 1

2、度为m的树、m叉树的区别

树的度————各结点的度的最大值
m叉树————每个结点最多只能有m个孩子的树

度为m的树m叉树
任意结点的度 <= m (最多m个孩子)任意结点的度 <= m(最多m个孩子)
至少有一个结点度 = m (有m个孩子)允许所有结点的度都 < m
一定是非空树,至少有m+1个结点可以是空树

3、度为 m 的树第 i 层至多有 mⁱ⁻¹ 个结点(i >= 1)

4、高度为 n 的 m 叉树至多有 mⁿ - 1/m-1 个结点

5、高度为 h 的 m 叉树至少有 h 个结点。 高度为 h、度为 m 的树至少有 h+m-1 个结点

6、具有 n 个结点的 m 叉树的最小高度为 在这里插入图片描述

树的存储结构

双亲表示法(顺序存储)

每一个结点中保存指向双亲的“指针”

#define MAX_REE_SIZE 100
typedef struct{       // 树结点定义 
	ElemType data;    // 数据元素
	int parent;       // 双亲位置域
} PTNode;
typedef struct{       // 树的类型定义
	PTNode nodes[MAX_REE_SIZE];  // 双亲表示 
	int n;            // 结点数
}PTree;

注意:根节点固定存储在0,-1 表示没有双亲

优点:查指定结点的双亲很方便
缺点:查指定结点的孩子只能从头遍历

孩子表示法(顺序+链式存储)

顺序存储各个结点,每个结点中保存孩子链表头指针

struct CTNode{
	int child;  // 孩子结点在数组中的位置
	struct CTNode *next;  // 下一个孩子
}
typedef struct{
	ElemType data;
	struct CTNode *firstChild; // 第一个孩子
}CTBox;
typedef struct{
	CTBox nodes[MAX_REE_SIZE];
	int n,r;   // 结点数和根的位置
}CTree;

孩子兄弟表示法(链式存储)

typedef struct CSNode{
	ElemType data;
	struct CSNode *firstChild,*nextsibling;  // 第一个孩子和右兄弟指针
}CSNode,*CSTree;

该方法相当于树和二叉树的转化(下一篇博客会讲到二叉树)
在这里插入图片描述

树和森林的遍历

树的遍历

1、先根遍历:若树非空,先访问根结点,再依次对每棵子树进行先根遍历

如上图的树:
A	 B		  	 C	    D
A	(B	E	F)  (C G)  (D H I J)
A   (B (EK) F)  (C G)  (D H I J)

得先根遍历结果为 ABEKFCGDHIJ

2、后根遍历:若树非空,先依次对每棵子树进行后根遍历,最后再访问根结点
3、层序遍历:用队列实现。①若树非空,则根结点入队。②若队列非空,队头元素出队并访问,同时将该元素的孩子依次入队。③重复②直到队列为空

树的后根遍历序列与这棵树相应二叉树的中序序列相同

森林的遍历

1、先根遍历:等同于依次对各个树进行先根遍历
2、中序遍历:等同于依次对各个树进行后根遍历,也等同于对对应的二叉树进行中序遍历

哈夫曼树

哈夫曼树的基础术语

结点的:有某种现实含义的数值(如:表示结点的重要性等)
结点的带权路径长度:从树的根到该 结点的路径长度(经过的边数)该结点上的权值乘积
树的带权路径长度:树中所有 叶子结点的带权路径 长度之和(WPL)

哈夫曼树的定义

在含有n个带权叶结点的二叉树中,其中带权路径长度(WPL)最小的二叉树称为哈夫曼树,也称为最优二叉树

哈夫曼树的构造

给定n个权值分别为 W1,W2,W3…Wn的结点,构造哈夫曼树的算法描述如下:
1、将这n个结点分别作为n棵仅含一个结点的二叉树,构造成森林F
2、构造一个新结点,从F中选取两棵根结点权值最小的树作为新结点的左、右子树,并且新结点的权值为左、右子树上根结点之和
3、从F中删除刚才选出的两棵树,同时将新得到的树加入F中
4、重复2、3步骤,直至F中只剩下一棵树为止

特点:
①每个初始结点最终都成为叶结点,且权值越小的结点到根结点的路径长度越大
②哈夫曼树的结点总数为2n-1
③哈夫曼树中不存在度为1的结点
④哈夫曼树并不唯一,但WPL必然相同且最优

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

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

相关文章

JVM、JRE、JDK

JVM JVM&#xff08;Java Virtual Machine&#xff09;是Java虚拟机的缩写&#xff0c;他是Java编程语言运行时环境&#xff0c;负责执行Java字节码。另外作为JVM虚拟机&#xff0c;它在各种操作系统上提供统一的平台&#xff0c;这帮助Java应用程序可以独立于操作系统底层运行…

Python自动化测试selenium指定截图文件名方法

这篇文章主要介绍了Python自动化测试selenium指定截图文件名方法&#xff0c;Selenium 支持 Web 浏览器的自动化&#xff0c;它提供一套测试函数&#xff0c;用于支持 Web 自动化测试&#xff0c;下文基于python实现指定截图文件名方法&#xff0c;需要的小伙伴可以参考一下 前…

Redis入门概述

Redis入门概述 1.redis是什么 是一种存在内存中的数据库。遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库。并且可以提供提供多种语言的 API。提供了主从模式、Redis Sentinel和Redis Cluster集群架构方案。总结来说redis是基于内存…

Ubuntu 下 VSCode Tab 间距非常小解决方案

Ubuntu 的 Tag 键很小&#xff0c;不利于阅读代码&#xff0c;检查 Tab Size 配的也没问题&#xff0c;也是4 解决方案为&#xff1a; 进入 设置-> 字体&#xff0c;把 红框中的 ‘Droid Sans Mono’, 删了 修改后如下&#xff1a; 再次回到代码界面&#xff0c;可以…

【框架源码篇 06】Spring源码题目

Spring源码面试题 谈谈你对Spring框架的理解? Spring 是一个开源的应用程序框架&#xff0c;它起源于 Rod Johnson 在其著名的 Spring Framework 专著中提出的一个轻量级框架的观念。下面是 Spring 的发展历史&#xff1a; 2002 年&#xff0c;Rod Johnson 发表了他的专著 …

硬盘驱动器(HDD)伺服系统鲁棒控制

在存在参数变化、非线性和噪声的情况下&#xff0c;轨道跟踪控制器必须实现更严格的调节。因此&#xff0c;利用闭环伺服系统采用μ合成和H∞优化等先进设计方法&#xff0c;实现鲁棒稳定性和鲁棒性能是合适的。 该磁盘组件由几个被称为圆盘的扁平磁盘组成&#xff0c;其两侧都…

找不到concrt140.dll无法继续执行此代码的解决方法总结,快速解决dll问题的5种方法

最近&#xff0c;我在使用电脑的过程中遇到了一个问题&#xff0c;即“找不到concrt140.dll无法继续执行此代码”。通过查阅资料和自己的实践&#xff0c;我了解到concrt140.dll是Microsoft Visual C 2015 Redistributable中的一个动态链接库文件。它提供了一些用于支持多线程编…

实战公益SRC | 弱口令登录+任意文件上传

目录 附言&#xff1a;从补天的公益src公司中选中了幸运儿。 1. 通过hunter鹰图平台搜索公司的相关资产&#xff0c;发现其采用了华途应用安全网关。 2.访问相关地址&#xff0c;尝试使用弱口令登录&#xff0c;发现直接利用admin/admin就登录了&#xff0c;可以看到后台的相…

Windows平台搭建wxWidgets 3.2.3开发环境

一.基础环境和使用的软件 操作系统:win11mingw工具集:i686-8.1.0-release-win32-sjljIDE:clionwxWidgets头文件:wxWidgets-3.2.3-headerswxWidgets库文件:wxMSW-3.2.3_gcc810_ReleaseDLL PS: 失败很多次才在网上看到, wxWidgets是挑mingw版本的.gcc用8.1,DLL就要用8.1 官网…

springBoot--ssm整合

ssm整合 1、创建项目并添加依赖2、配置数据源3、创建bean文件4、创建接口文件4.1创建接口文件4.2通过插件生成到mapper文件的xml文件4.3通过param进行签名&#xff0c;以后使用指定的名字在sql中取值4.4在sql语句中通过#{}进行取值4.5mapperScan:告诉MyBatis,扫描那个包下面的所…

【Acwing166】数独(dfs+剪枝+位运算)超级详细题解!

本题思路来源于acwing算法提高课 题目描述 看本文需要准备的知识 1.dfs算法基本思想 2.位运算基础 3.对剪枝这个名词的大概了解 剪枝优化位运算优化 常见四种剪枝策略 首先考虑这道题的搜索顺序&#xff0c;很明显&#xff0c;可以随意选择一个空格子&#xff0c;分支为这…

深入理解Java中的AbstractQueuedSynchronizer(AQS):并发编程的核心组件

文章目录 &#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文创造者、技术文章评审老师、问卷调查设计师、个人社区创始人、开源项目贡献者。&#x1f30e;跑过十五…

wait、notify、notifyAll 方法的使用注意事项?

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 我们主要学习 wait/notify/notifyAll 方法的使用注意事项。 我们主要从三个问题入手&#xff1a; 为什么 wait 方法必须在 synchronized 保护的同步代码中使用&#xff1f;为什么 wait/notify/notifyAll 被定义在 …

基于灰狼算法的无人机航迹规划-附代码

基于灰狼算法的无人机航迹规划 文章目录 基于灰狼算法的无人机航迹规划1.灰狼搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用灰狼算法来优化无人机航迹规划。 1.灰狼搜索算法 …

Python桌面应用之XX学院水卡报表查询系统(Tkinter+cx_Oracle)

一、功能样式 Python桌面应用之XX学院水卡报表查询系统功能&#xff1a; 连接Oracle数据库&#xff0c;查询XX学院水卡操作总明细报表&#xff0c;汇总数据报表&#xff0c;个人明细报表&#xff0c;进行预览并且支持导出报表 1.总明细报表样式 2.汇总明细样式 3.个人明细…

Proteus仿真--VB上位机程序控制DS1302时钟仿真(Proteus仿真+程序)

本文主要介绍基于51单片机的VB上位机程序控制DS1302时钟仿真设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 简介 硬件电路主要分为单片机主控模块、DS1302模块、LCD1602液晶显示模块以及串口模块 &#xff08;1&#xff09;单片机主控模块&#xff1a;单片机选…

Unity编辑器扩展 --- AssetPostprocessor资源导入自动设置

unity导入资源的编辑器设置: 防止策划资源乱导入,资源导入需要的格式&#xff0c;统一资源管理 AssetPostprocessor资源导入管线 AssetPostprocessor用于在资源导入时自动做一些设置&#xff0c;比如当导入大量图片时&#xff0c;自动设置图片的类型&#xff0c;大小等。Ass…

volatile-读写屏障插入策略

6.2.4 困难内容 JMM就将内存屏障插入策略分为4种规则 读屏障&#xff1a; 写屏障&#xff1a;

图像语义分割 pytorch复现DeepLab v1图像分割网络详解以及pytorch复现(骨干网络基于VGG16、ResNet50、ResNet101)

图像语义分割 pytorch复现DeepLab v1图像分割网络详解以及pytorch复现&#xff08;骨干网络基于VGG16、ResNet50、ResNet101&#xff09; 背景介绍2、 网络结构详解2.1 LarFOV效果分析 2.2 DeepLab v1-LargeFOV 模型架构2.3 MSc&#xff08;Multi-Scale&#xff0c;多尺度(预测…

Docker Swarm 节点维护

Docker Swarm Mode Docker Swarm 集群搭建 Docker Swarm 节点维护 Docker Service 创建 1.角色转换 Swarm 集群中节点的角色只有 manager 与 worker&#xff0c;所以其角色也只是在 manager 与worker 间的转换。即 worker 升级为 manager&#xff0c;或 manager 降级为 worke…