数据结构(六)——树和二叉树

一、树和二叉树的定义与存储

1.树的定义

树是一种非线性的数据结构,它是由n个有限结点组成有层次关系的集合

树具有以下特点:

(1)每个结点具有0个或多个子结点

(2)每个子结点只有一个父结点

(3)没有前驱的结点为根结点

(4)除了根结点外,每个子结点又可以由m棵不相关的子树组成

2.树的基本术语

(1)结点的度:结点拥有的子树数量称为结点的度

(2)树的度:树内各结点度的最大值,即上图 D结点的度就是此树的度

(3)叶子:度为 0的节点称为叶子或终端节点

(4)结点的层次和树的深度

结点的从根开始定义起,根为第一层,根的孩子为第二层,以此类推,树的深度或高度是树中结点的最大层次

(5)森林:m棵互不相交的树的集合

3.二叉树与树主要有以下区别:

(1)二叉树每个结点至多只有两颗子树(即二叉树中不能存在度大于2的结点)

(2)二叉树的子树有左右之分,其次序不能任意颠倒

(3)即使树中某结点只有一颗子树,也要区分它是左子树还是右子树

4.二叉树的性质:

性质1:在二叉树的第i层上至多有 2的i-1次方 个结点(i>=1)

性质2:深度为k的二叉树至多有 2的k次方-1 个结点(k>=1)

性质3:对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1

【证明】一棵二叉树,除了终端结点(叶子结点),就是度为1或2的结点。假设n1表示度为1的结点数,则树T的结点总数n=n0+n1+n2,我们再换个角度,看一下树T的连接线数,除了根节点,其他结点都有一根线表示分支进入,所以连接线数为结点总数减去1。按连接线树算的话:n-1=n1+2n2,可推导出n0+n1+n2-1=n1+2n2,继续推导可得n0=n2+1

性质4:具有n个结点的完全二叉树的深度为(这里的[]是向下取整)

性质5:如果对一颗有n个结点的完全二叉树(其深度为)的结点按层序编号(从第1层到第层,每层从左到右),对任一结点i(1<=i<=n)有:

(1)如果 i = 1,则结点 i 是二叉树的根,无双亲;如果 i > 1,则其双亲是结点[i/2]

(2)如果 2i > n,则结点 i 无孩子(结点 i 为叶子结点);否则其左孩子是结点 2i

(3)如果 2i+1 > n ,则结点i无右孩子;否则其右孩子是结点 2i+1

5.二叉树的存储:顺序存储、链式存储

(1)二叉树的顺序存储结构缺点很明显:不能反应逻辑关系;对于特殊的二叉树(左斜树、右斜树),浪费存储空间。所以二叉树顺序存储结构一般只用于完全二叉树

(2)二叉树的链式存储

//二叉树的二叉链表存储表示
typedef struct BiTNode{
//结点数据域TElemType data;
//左右孩子指针struct BiTNode *1child,*r1child;
}BiTNode,*BiTree;

 

二、二叉树的遍历

二叉树的遍历:按某条搜索路径访问二叉树中每一个结点,使得每个结点被访问一次且仅被访问一次。遍历方法有4种:先序遍历,中序遍历,后序遍历,层次遍历

1.先序遍历

(1)访问根节点

(2)先序遍历左子树

(3)先序遍历右子树

先序遍历序列(根左右):abcdfge

2.中序遍历

(1)中序遍历左子树

(2)访问根节点

(3)中序遍历右子树

中序遍历序列(左根右):bafgdce

3.后序遍历

(1)后序遍历左子树

(2)后序遍历右子树

(3)访问根结点

后序遍历序列(左右根):bgfdeca

简便方法:

4.层序遍历

按层次(1-k层),每层从左到右依次访问二叉树中的每个结点

层次遍历序列:abcdefg

eg:已知二叉树先序遍历序列是:abcdefg;中序遍历序列是:cbdaefg

(1)画出该二叉树

(2)写出后序遍历序列  

cdbgfea

三、哈夫曼树

1.基本概念识记

(1)路径:从一个结点到另一个结点之间的分支序列

(2)路径长度:从一个结点到另一个结点所经过的分支数目

(3)结点的权:根据应用的需要可以给树的结点赋权值

(4)结点的带权路径长度:从根到该结点的路径长度与该结点权的乘积

(5)树的带权路径长度:树中所有叶子结点的带权路径之和

其中,n是树的叶结点个数,wk是第k个叶子的权,lk是第k个叶子到根的路径长度。

(6)哈夫曼树:由n个带权叶子结点构成的所有二叉树中带权路径长度最短的二叉树

n个叶子结点的哈弗曼树有(2n-1) 个结点

在构造哈弗曼树时,是从叶子结点向根节点的方向进行的,每次都是两个两个成对的结点来形成一个新的分支结点,所以不存在度为1的结点。

2.哈夫曼树的构造

对于有n个叶子结点,可以构造出多个二叉树。但Huffman树是一个带权路径长度最小的二叉树,又称最优二又树。方法:

(1)将{w1,w2.,…,wn}看成n个二叉树;
(2)选择2个根结点的值最小的二叉树,构造1个新的二叉树;......; 直至剩1个树止。

eg:某系统在通信联络中只可能出现8个字符,其出现概率分别是:

Z   K   F   C   U   D   L   E

2   7  24  32  37 42  42  120

请构造哈夫曼树

(1)排序:

(2)依次选取两个最小的连在一起

进行排版:

3.哈夫曼编码

前缀码:如果在一个编码系统中,任一个编码都不是其他任何编码的前缀,则称该编码系统中的编码是前缀码。例如,一组编码01,001,010,100,110就不是前缀码,因为01是010的前缀,若去掉01或010就是前缀码。

哈夫曼编码:对一棵具有n个叶子的哈夫曼树,若对树中的每个左分支赋予0,右分支赋子1,则从根到每个叶子的通路上,各分支的赋值分别构成一个二进制串,该二进制串就称为哈夫曼编码。

哈夫曼编码是最优前缀码

 

四、习题

答案:A

解释:因为二叉树有左孩子、右孩子之分,故一棵树转换成二叉树之后,这棵二叉树的形态是唯一的

答案:D

解释:枚举法

  

答案:D

解释:设度为0结点((叶子结点)个数为A,度为1的结点个数为B,度为2的结点个数为C,有A=C+1,A+B+C=1001,可得2C+B=1000,由完全二叉树的性质可得B=0或1,又因为C为整数,所以B=0,C=500,A=501,即有501个叶子结点。

答案:C 

解释:若每层仅有一个结点,则树高h为1025;且其最小树高为[log2 1025]+1=11,即h在11至1025之间。

 答案:A

解释:深度为h的满m叉树共有 m的h次方-1 个结点,第k层有 m的k次方-1 个结点

答案:C

 解释:因为先序遍历结果是“根左右”,后序遍历结果是“左右根”,当没有左子树时,就是“根右”和“右根”;当没有右子树时,就是“根左”和“左根”。则所有的结点均无左孩子或所有的结点均无右孩子均可,所以A、B不能选又所有的结点均无左孩子与所有的结点均无右孩子时,均只有一个叶子结点,故选C。

答案: B

解释:在哈夫曼树中没有度为1的结点,只有度为0(叶子结点)和度为2的结点。设叶子结点的个数为n0,度为2的结点的个数为n2,由二叉树的性质n0=n2+1,则总结点数n=n0+n2=2*n0-1,得到n0=100。

答案:A

解释:哈夫曼树的构造过程是每次都选取权值最小的树作为左右子树构造一棵新的二叉树,所以树中一定没有度为1的结点、两个权值最小的结点一定是兄弟结点、任一非叶结点的权值一定不小于下一层任一结点的权值

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

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

相关文章

DICOM 网络服务实现:医学影像传输与管理的技术实践

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…

TongWeb7.0常用-D参数说明

Web容器相关启动参数配置 属性 含义 -Dtongweb.restart.interval 设置宕机后重启的时间间隔&#xff0c;以秒为单位。如果不设置这个参数&#xff0c;默认为1秒 -Dmonitor.abnormal.restart 设置服务器非正常状态时是否重启&#xff0c;如果不设置这个参数或者参数值不为…

软件架构评估方法全面解析

介绍 在软件开发过程中&#xff0c;架构设计的好坏直接影响系统的可维护性、可扩展性和性能。因此&#xff0c;软件架构评估&#xff08;Software Architecture Evaluation&#xff09;成为确保架构质量的关键步骤。本文将介绍几种主流的架构评估方法&#xff0c;包括ATAM、SA…

我开源了一个免费在线工具!UIED Tools

UIED Tools - 免费在线工具集合 最近更新&#xff1a;修改了文档说明&#xff0c;优化了项目结构介绍 这是设计师转开发的第一个开源项目&#xff0c;bug和代码规范可能有些欠缺。 这是一个功能丰富的免费在线工具集合网站&#xff0c;集成了多种实用工具&#xff0c;包括 AI …

【vue】全局组件及组件模块抽离

一、全局组件 只要是实例化过的区域都可以使用 Vue.component("组件名",{ template: 内容} ) 二、组件模块抽离 抽离就是把template的内容写到body里面&#xff0c;然后建立id写到变量下的template里&#xff0c;id变量写到component里 body{ template&#xff1a; …

深入理解 iOS 开发中的 `use_frameworks!`

在使用 CocoaPods 管理 iOS 项目依赖时&#xff0c;开发者经常会在 Podfile 文件中看到一个配置选项&#xff1a;use_frameworks!。本文将详细介绍这个配置选项的含义&#xff0c;以及如何决定是否在项目中使用它。 一、什么是 use_frameworks! 在 CocoaPods 中引入第三方库时…

《Python星球日记》 第57天:LSTM 与 GRU

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、LSTM 的门控机制1. LSTM 结构概述2. 遗忘门(Forget Gate)3. 输入门(Input Gate)4. 输出门(Output Gate)5. 记忆单元更新过程二、GRU 的简化…

Java SE所需工具与常见类型和运算符介绍

1.Java SE所需工具 1.1 JDK JDK全称为Java Develepment Kit(Java开发者工具包&#xff09;&#xff0c;包括了Java运行环境JRE&#xff08;Java Runtime Envirnment&#xff09;、一堆Java工具&#xff08;javac/java/jdb等&#xff09;和Java基础的类库&#xff08;即Java A…

QT6.8安装教程

官网下载 链接&#xff1a; Index of /official_releases/online_installers 这个比较慢 建议去 清华大学开源软件镜像站&#xff1a;Index of /qt/archive/online_installers/4.9/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 根据自己什么系统选择 点击打开…

MIT XV6 - 1.3 Lab: Xv6 and Unix utilities - primes

接上文 MIT XV6 - 1.2 Lab: Xv6 and Unix utilities - pingpong primes 继续实验&#xff0c;实验介绍和要求如下 (原文链接 译文链接) : Write a concurrent prime sieve program for xv6 using pipes and the design illustrated in the picture halfway down this page and…

hive两个表不同数据类型字段关联引发的数据倾斜

不同数据类型引发的Hive数据倾斜解决方案 #### 一、‌原因分析‌ 当两个表的关联字段存在数据类型不一致时&#xff08;如int vs string、bigint vs decimal&#xff09;&#xff0c;Hive会触发隐式类型转换引发以下问题&#xff1a; ‌Key值的精度损失‌&#xff1a;若关联字…

【JAVA】业务系统订单号,流水号生成规则工具类

设计业务系统订单号&#xff0c;流水号注意事项 唯一性&#xff1a;确保在分布式环境下ID不重复 有序性&#xff1a;ID随时间递增&#xff0c;有利于数据库索引性能 可读性&#xff1a;包含时间信息&#xff0c;便于人工识别 扩展性&#xff1a;支持业务前缀和类型区分 性能…

【嵌入式开发-SPI】

嵌入式开发-SPI ■ SPI简介■ SPI &#xff08;Standard SPI&#xff09;■ DSPI &#xff08;Dual SPI&#xff09;■ QSPI是 Queued SPI的简写 ■ SPI简介 SPI协议其实是包括&#xff1a;Standard SPI、Dual SPI和Queued SPI三种协议接口&#xff0c;分别对应3-wire, 4-wire…

基于HTTP头部字段的SQL注入:SQLi-labs第17-20关

前置知识&#xff1a;HTTP头部介绍 HTTP&#xff08;超文本传输协议&#xff09;头部&#xff08;Headers&#xff09;是客户端和服务器在通信时传递的元数据&#xff0c;用于控制请求和响应的行为、传递附加信息或定义内容类型等。它们分为请求头&#xff08;Request Headers&…

基于Qt开发的http/https客户端

成果展示&#xff1a; 使用Qt开发HTTP客户端主要依赖QNetworkAccessManager、QNetworkRequest和QNetworkReply三大核心类。以下是具体实现要点及最佳实践&#xff1a; 一、核心类与基础流程​​ 1.QNetworkAccessManager​​ 作为HTTP请求的管理者&#xff0c;负责异步处理…

自适应蒙特卡洛定位-AMCL

自适应蒙特卡洛定位&#xff0c;简称AMCL&#xff0c;主要提供定位功能并以/tf形式输出 蒙特卡洛算法的基本思想&#xff1a;当所要求的问题是某种事件出现的概率或者是某个变量的期望值时&#xff0c;它们可以通过某种"试验"的方法&#xff0c;得到这种事件出现的概…

鲁滨逊归结原理详解:期末考点+解题指南

1. 引言 归结原理&#xff08;Resolution Principle&#xff09; 是自动定理证明和逻辑推理的核心技术&#xff0c;由约翰艾伦罗宾逊&#xff08;John Alan Robinson&#xff09;于1965年提出。它是一阶谓词逻辑的机械化推理方法&#xff0c;广泛应用于人工智能&#xff08;如…

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1商用服务开通教程以及模型体验

在当今数字化浪潮迅猛推进的时代&#xff0c;云计算与人工智能技术的深度融合正不断催生出众多创新应用与服务&#xff0c;为企业和个人用户带来了前所未有的便利与发展机遇。本文将重点聚焦于在华为云这一行业领先的云计算平台上&#xff0c;对 DeepSeek-V3/R1 商用服务展开的…

Matlab基于PSO-MVMD粒子群算法优化多元变分模态分解

Matlab基于PSO-MVMD粒子群算法优化多元变分模态分解 目录 Matlab基于PSO-MVMD粒子群算法优化多元变分模态分解效果一览基本介绍程序设计参考资料效果一览 基本介绍 PSO-MVMD粒子群算法优化多元变分模态分解 可直接运行 分解效果好 适合作为创新点(Matlab完整源码和数据),以包…

自然语言处理NLP中的连续词袋(Continuous bag of words,CBOW)方法、优势、作用和程序举例

自然语言处理NLP中的连续词袋&#xff08;Continuous bag of words&#xff0c;CBOW&#xff09;方法、优势、作用和程序举例 目录 自然语言处理NLP中的连续词袋&#xff08;Continuous bag of words&#xff0c;CBOW&#xff09;方法、优势、作用和程序举例一、连续词袋( Cont…