【数据结构】(三)树Tree

 
 

目录

1、基本概念

2、二叉树Binary Tree

3、树、森林与二叉树的转换

4、赫夫曼树Huffman Tree与赫夫曼编码Huffman Coding


1、基本概念

(1)树(Tree)是 n(n ≥\geq 1)个节点的有限集,n = 0时称为空树。

(2)非空树唯一拥有一个根(Root)结点(Node),n > 1时其余结点可分为m(m > 0)个互不相交的有限集并各自成根的子树(Sub Tree)。

(3)结点拥有的子树数目称为结点的度(Degree),度为 0 的结点称为叶结点(Leaf),树的度是树各结点的度的最大值。

(4)结点之间的关系:兄弟(Sibling)——孩子(Child)——双亲(Parent)

(5)结点的层次(Level)从根算起,根为第一层,根的孩子为第二层一直往下,最大层次为深度(Depth)。

(6)如果将树中结点的各子树看成从左至右呈有次序的不能互换的,则称该树为有序树,否则称为无序树。

(7)森林(Forest)是 m(m ≥\geq 0)棵互不相交的树的集合。对树中每个结点而言,其子树的集合即为森林。

(8)树的双亲表示法如下,data数据域存储结点的数据信息;parent指针域存储该结点双亲在数组中的下标,根结点的parent定义为 -1 即不存在该结点。

2、二叉树Binary Tree

(1)每个结点的度 ≤\leq 2,左右有次序之分的树称为二叉树。

(2)二叉树的五种基本形态:空二叉树、只有一个根结点、根结点只有左子树、根结点只有右子树、根结点既有左子树又有右子树。

(3)斜树包含左斜树(所有结点都只有左子树的二叉树)和右斜树(所有结点都只有右子树的二叉树),每一层都只有一个结点,结点个数即二叉斜树的深度(同线性表结构)。

(4)满二叉树:叶结点仅在最下层,非叶非根的结点度数均为 2 的二叉树。

满二叉树

(5)完全二叉树:按层序从上到下从左到右编号结点的位置与满二叉树相同的二叉树,特点有叶结点仅在最下两层,最下层叶子集中在左部连续位置,同结点数的二叉树深度最小。

完全二叉树

(6)二叉树的数学性质有:

(i) 第 i 层至多 2i−12^{i-1} 个结点(i ≥\geq 1)

(ii) 深度为k时至多有 2k2^{k} -1个结点(k ≥\geq1)

(iii) 所有节点的度数之和等于节点总数-1,若叶子结点数为 n0n_{0} ,度为2的结点数为n1n_{1} ,则n0n_{0} = n1n_{1} + 1( 二叉树除了叶结点就是度为1或2的结点)

(iv) 具有n个结点的完全二叉树的深度为[logn]+1

(7)顺序存储结构:一般只用于完全二叉树。

(8)二叉链表:一个数据域+两个指针域。

(9)遍历二叉树:从根节点出发,按某种次序依次唯一地访问每个结点。

(i) 前序遍历:若二叉树为空,则空操作返回,否则先访问根结点,然后遍历左子树, 再遍历右子树

(i) 中序遍历:若二叉树为空,则空操作返回,否则先遍历左子树,然后访问根结点,再遍历右子树

(i) 后序遍历:若二叉树为空,则空操作返回,否则从左到右先叶子后结点遍历访问左右子树,最后根结点

(i) 层序遍历:若二叉树为空,则空操作返回,否则从第一层根结点开始往下从左到右对结点逐个访问。

已知前 + 中序 / 中 + 后序遍历序列,都可以唯一确定一棵二叉树。

3、树、森林与二叉树的转换

(1)树转换为二叉树

(i) 加线;在所有兄弟结点之间加一条连线。

(ii) 去线;每个结点只保留它与第一个孩子结点的连线,删除它与其他孩子结点之间的连线。

(iii) 层次调整:以树的根结点为轴心,将整棵树顺时针旋转一定角度使其结构层次分明。

(2)森林转二叉树

(i) 将每棵树转换为二叉树。

(ii) 第一棵二叉树不动,从第二棵开始依次把后一棵二叉树的根结点作为前一棵根结点的右孩子,连线。

(3)二叉树转换成树

(i) 加线;左孩子的n个右孩子结点都作为此结点的孩子。将该结点与这些右孩子结点用线连接起来。

(ii) 去线;删除原二叉树中所有结点与其右孩子结点的连线。

(4)二叉树转森林

(i) 从根结点开始,若存在右孩子,则删除与右孩子的连线。

(ii) 再查看分离后的二叉树,若存在右孩子,则连线删除,直到所有右孩子连线删除为止。

(iii) 再将分离的二叉树都转换为树即可。

4、赫夫曼树Huffman Tree与赫夫曼编码Huffman Coding

从树一个结点到另一个结点的之间的分支构成两个结点之间的路径,路径分支数目称为路径长度。树的路径长度即从树根到每一结点的路径长度之和,结点间连线相关数称为权(Weight)。树的带权路径长度为树中所有叶子结点的带权路径长度之和,带权路径长度WPL最小的二叉树称为赫夫曼树。

二叉树a的路径长度为1+1+2+2+3+3+4+4=20,WPL = 5×\times1 + 15×\times2 + 40×\times3 + 30×\times4 + 10×\times4 = 315

二叉树b的路径长度为1+2+3+3+2+1+2+2=16,WPL = 5×\times3 +15×\times3 + 40×\times2 + 30×\times2 + 10×\times4 = 220

我们可以得出构造赫夫曼树的算法描述:

(1)根据给定的n个权值{ w1w_{1},w2w_{2},w3w_{3}……,wnw_{n}},构成 n 棵二叉树的集合F={ T1T_{1},T2T_{2},T3T_{3}……,TnT_{n}},其中每棵二叉树T中只有一个带权为w的根结点,其左右子树均为空。

(2)在 F 中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,并置新的二叉树的根结点的权值为其左右子树上根结点的权值之和。

(3)在 F 中删除这两棵树,同时将新得到的二叉树加入F中。

(4)重复步骤(2)和(3)直到F只含一棵树为止,这棵树便是赫夫曼树。

赫夫曼编码:规定赫夫曼树的左分支代表0,右分支代表1,则从根结点到叶子结点所经过的路径分支组成的0和1的序列便为该结点对应字符的编码,即赫夫曼编码,它在信息存储与传输过程中对信息高效压缩。

假设六个字母的频率为A 27,B 8,C 15,D 15,E 30,F 5,合起来正好是100%,赫夫曼树构造如下:

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

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

相关文章

JavaScript基础(一)旧版基础笔记总结

开新藩(虽然博主早以前已经学过了),从0开始复习JS,一方面应对毕设,一方面后期可能找找实习,一方面复试可能也会涉及到吧,说起这个最近越等越焦虑QAQ,还要一个月才出分呢...... 本帖先…

HubSpot CRM是什么?有什么功能和特点?

HubSpot CRM(Customer Relationship Management,客户关系管理)是一款由HubSpot公司开发的免费的、云端的CRM软件。HubSpot CRM致力于帮助企业更好地管理客户关系,提高销售效率,同时通过集成多个营销、销售和服务工具&a…

springboot mybatis-plus 项目分层笔记

整体定义 config: 配置项,包含configuration注解 constants: 常量类enums: 枚举 exceptions: 全局异常处理,自定义异常,RestControllerAdvice 注解 fia3: 三大器依据执行顺序:过滤器filter、拦截器interceptor、切面aop 简称 fia…

中科大计网学习记录笔记(一):Internet | 网络边缘

计算机网络 前言: 学习视频:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》课程 该视频是B站非常著名的计网学习视频,但相信很多朋友和我一样在听完前面…

时间序列预测 —— LSTM模型

时间序列预测 —— LSTM模型 1. 引言 时间序列预测是指在给定的历史时间序列数据上,使用模型来预测未来的数值。长短时记忆网络(Long Short-Term Memory, LSTM)是一种深度学习模型,广泛应用于时间序列预测任务。本文将介绍LSTM模型的理论基础、相关公式,分析其优缺点,并…

牛客,OR36 链表的回文结构,快慢指针和反转链表的实践

链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 还是比较简单的,主要分为三个步骤,两种需掌握的函数实现 目录 主要思路过程,1,找到中间结点,2,反转中间结点往后的结点,3,遍历比…

ChatGPT 被曝泄露私密对话;美国 AI 企业一天蒸发 1.3 万亿市值丨 RTE 开发者日报 Vol.139

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE (Real Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

【产业实践】使用YOLO V5 训练自有数据集,并且在C# Winform上通过onnx模块进行预测全流程打通

使用YOLO V5 训练自有数据集,并且在C# Winform上通过onnx模块进行预测全流程打通 效果图 背景介绍 当谈到目标检测算法时,YOLO(You Only Look Once)系列算法是一个备受关注的领域。YOLO通过将目标检测任务转化为一个回归问题,实现了快速且准确的目标检测。以下是YOLO的基…

PVE报错处理:kvm [2205]: vcpu0 ignored RDMSR: 0x1b8

PVE使用过程中如果遇到:kvm [2205]: vcpu0 ignored RDMSR: 0x1b8 报错信息处理方法 vim /etc/modprobe.d/kvm.conf "options kvm ignore_msrsY",这里在msrsY后面加一个空格,然后粘贴report_ignored_msrsN,使其变成 op…

学习嵌入式第十五天之结构体

用变量a给出下面的定义 a) 一个整型数(An integer) //int a;b) 一个指向整型数的指针(A pointer to an integer) //int *a;c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a poin…

这篇秒杀设计都可以拿来讲课了【史上最详细的秒杀设计方案】

文章目录 🍀 简介🌵 设计关注点🌲 瞬时高并发🌳 页面静态化🌴 秒杀按钮🌾 读多写少🍄 缓存问题🚀 缓存击穿🌽 缓存穿透 🍎 库存问题🍓 数据库扣减…

【数据结构】 归并排序超详解

1.基本思想 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。 将已有序的子序列合并,得到完全有序的序列,即先使每个子序列有序…

vulnhub通关-2 DC-2(含靶场资源)

文章目录 一、环境搭建1.环境描述靶场描述题目表述概括(目标) 2.靶场下载下载地址 3.环境启动 二、渗透靶场1.信息收集:寻找靶机IP分析nmap扫描存活主机 2.信息收集:服务和端口探测命令解析 3.访问Web跳转问题解决办法hosts文件路…

js 设置、获取、删除标签属性以及H5自定义属性

1. 设置标签属性 使用setAttribute()(‘属性名’, ‘属性值’)方法可以添加、修改、删除属性。   下面的demo是为input添加、修改、删除value属性&#xff1a; 1.1. HTML <input type"text" class"input"> <input type"text" class…

【数据结构(C语言)】树、二叉树详解

目录 文章目录 前言 一、树的概念及结构 1.1 树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用 二、二叉树的概念及结构 2.1 二叉树的概念 2.2 二叉树的基本形态 ​编辑2.3 特殊的二叉树 2.4 二叉树的性质 2.5 二叉树的存储结构 三、二叉树的顺序结…

【C语言】数组的应用:三子棋游戏

由于代码较长&#xff0c;为了增加可读性&#xff0c;我们把代码分别写到game.h&#xff0c;game.c&#xff0c;test.c&#xff0c;里面&#xff0c;其中game.h用来声明函数&#xff0c;实现函数功能的代码在game.c&#xff0c;测试游戏的代码在test.c 为了方便后续的更改&…

使用 ChatGPT 为生物信息学初学者赋能

论文&#xff1a;Empowering Beginners in Bioinformatics with ChatGPT. 2023 对于生信初学者而言&#xff0c;最大的困难是身边没有经验丰富的人给予指导。而ChatGTP的出现可能改变这一现状&#xff0c;学生可以自己作为导师&#xff0c;指导ChatGPT完成数据分析工作。 众所周…

Kotlin中的内置函数-apply、let

在使用Kotlin的过程中会经常用到其内置函数&#xff0c;包括apply&#xff0c;let&#xff0c;run&#xff0c;with&#xff0c;also&#xff0c;takeIf,takeUnless函数等&#xff0c;想要更好熟悉Kotlin&#xff0c;这些函数必须烂熟于心&#xff0c;接下来让我们来逐步了解&a…

ubuntu16.04环境轻松安装和应用opencv4.9.0(基于源码编译)

目录 一、环境准备 1、安装cmake 2、安装依赖 3、从github上下载opencv4.9.0.zip 二、安装opencv4.9.0 1、解压4.9.0.zip 2、进入build目录编译 3、安装编译好的相关库 4、修改opencv配置文件并使其生效 5、添加PKG_CONFIG路径&#xff0c;并使其生效 三、opencv环境…

linux安装docker-compose

1:安装 在这里 下载&#xff0c;解压后得到docker-compose文件&#xff0c;放在某个目录后在/etc/profile中配置&#xff0c;我这里如下&#xff1a; 接着执行docker-compose version验证&#xff0c;是否成功&#xff1a; [elklocalhost ~]$ docker-compose version docker…