数据结构复习指导之树、森林

news2024/9/20 8:53:41

文章目录

树、森林

考纲内容

复习提示

1.树的存储结构

1.1双亲表示法

1.2孩子表示法

1.3孩子兄弟表示法

2.树、森林、与二叉树的转换

2.1树转换为二叉树

2.2森林转换为二叉树

2.3二叉树转换为森林

3.树和森林的遍历

3.1树的遍历

3.2森林的遍历


树、森林

考纲内容

(一)树的基本概念
(二)二叉树
           二叉树的定义及其主要特征;二叉树的顺序存储结构和链式存储结构;
           二叉树的遍历;线索二叉树的基本概念和构造
(三)树、森林
           树的存储结构;森林与二叉树的转换;树和森林的遍历
(四)树与二叉树的应用
           哈夫曼(Huffman)树和哈夫曼编码;并查集及其应用

复习提示

本章内容多以选择题或综合题的形式考查,但统考也会出涉及树遍历相关的算法题。树和二叉树的性质、遍历操作、转换、存储结构和操作特性等,满二叉树、完全二叉树、线索二叉树、哈夫曼树的定义和性质,都是选择题必然会涉及的内容。

1.树的存储结构

树的存储方式有多种,既可采用顺序存储结构,又可采用链式存储结构,但无论采用何种存储方式,都要求能唯一地反映树中各结点之间的逻辑关系,这里介绍3种常用的存储结构。

1.1双亲表示法

这种存储结构采用一组连续空间来存储每个结点,同时在每个结点中增设一个伪指针,指示其双亲结点在数组中的位置。如图5.21所示,根结点下标为0,其伪指针域为-1。

双亲表示法的存储结构描述如下:

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

双亲表示法利用了每个结点(根结点除外)只有唯一双亲的性质,可以很快地得到每个结点的双亲结点,但求结点的孩子时则需要遍历整个结构。

注意:区别树的顺序存储结构与二叉树的顺序存储结构。在树的顺序存储结构中,数组下标代表结点的编号,下标中所存的内容指示了结点之间的关系。而在二叉树的顺序存储结构中,数组下标既代表了结点的编号,又指示了二叉树中各结点之间的关系。当然,二叉树属于树,因此二叉树也可用树的存储结构来存储,但树却不都能用二叉树的存储结构来存储。

1.2孩子表示法

孩子表示法是将每个结点的孩子结点视为一个线性表,且以单链表作为存储结构,则n个结点就有n个孩子链表(叶结点的孩子链表为空表)。而n个头指针又组成一个线性表,为便于查找,可采用顺序存储结构。图5.22(a)是图 5.21(a)中的树的孩子表示法。

与双亲表示法相反,孩子表示法寻找孩子的操作非常方便,而寻找双亲的操作则需要遍历n个结点中孩子链表指针域所指向的n个孩子链表。

1.3孩子兄弟表示法

孩子兄弟表示法又称二叉树表示法,即以二叉链表作为树的存储结构。孩子兄弟表示法使每个结点包括三部分内容:结点值、指向结点第一个孩子结点的指针,以及指向结点下一个兄弟结点的指针(沿此域可以找到结点的所有兄弟结点),如图5.22(b)所示。
孩子兄弟表示法的存储结构描述如下:

typedef struct CsNode{
    ElemType data;                            //数据域
    struct CSNode *firstchild,*nextsibling;   //第一个孩子和右兄弟指针
}CSNode,*CsTree;

孩子兄弟表示法比较灵活,其最大的优点是可以方便地实现树转换为二叉树的操作,易于查找结点的孩子等,但缺点是从当前结点査找其双亲结点比较麻烦。若为每个结点增设一个 parent域指向其父结点,则查找结点的父结点也很方便。

2.树、森林、与二叉树的转换

二叉树和树都可以用二叉链表作为存储结构。从物理结构上看,树的孩子兄弟表示法与二叉树的二叉链表表示法是相同的,因此可以用同一存储结构的不同解释将一棵树转换为二叉树。

2.1树转换为二叉树

命题追踪——树和二叉树的转换及相关性质的推理

树转换为二叉树的规则:每个结点的左指针指向它的第一个孩子,右指针指向它在树中的相邻右兄弟,这个规则又称“左孩子右兄弟”。由于根结点没有兄弟,因此树转换得到的二叉树没有右子树,如图 5.23 所示。

树转换为二叉树的画法:

1) 在兄弟结点之间加一连线;

2) 对每个结点,只保留它与第一个孩子的连线,而与其他孩子的连线全部抹掉:

3) 以树根为轴心,顺时针旋转 45°。

2.2森林转换为二叉树

命题追踪——森林和二叉树的转换及相关性质的推理

将森林转换为二叉树的规则与树类似。先将森林中的每棵树转换为二叉树,由于任意一棵树对应的二叉树的右子树必空,若把森林中第二棵树根视为第一棵树根的右兄弟,即将第二棵树对应的二叉树当作第一棵二叉树根的右子树,将第三棵树对应的二叉树当作第二棵二叉树根的右子树,以此类推,就可以将森林转换为二叉树。

森林转换为二叉树的画法:

1) 将森林中的每棵树转换成相应的二叉树;

2) 每棵树的根也可视为兄弟关系,在每棵树的根之间加一根连线:

3) 以第一棵树的根为轴心顺时针旋转 45°。

2.3二叉树转换为森林

命题追踪——由遍历序列构造一棵二叉树并转换为对应的森林

二叉树转换为森林的规则:

若二叉树非空,则二叉树的根及其左子树为第一棵树的二叉树形式,所以将根的右链断开。

二叉树根的右子树又可视为一个由除第一棵树外的森林转换后的二叉树,应用同样的方法,直到最后只剩一棵没有右子树的二叉树为止,最后将每棵二叉树依次转换
成树,就得到了原森林,如图5.24所示。二叉树转换为树或森林是唯一的。

3.树和森林的遍历

3.1树的遍历

命题追踪——树与二叉树遍历方法的对应关系

树的遍历是指用某种方式访问树中的每个结点,且仅访问一次。主要有两种方式:

1) 先根遍历。若树非空,则按如下规则遍历:

  • 先访问根结点。
  • 再依次遍历根结点的每棵子树,遍历子树时仍遵循先根后子树的规则

其遍历序列与这棵树相应二叉树的先序序列相同。

2) 后根遍历。若树非空,则按如下规则遍历:

  • 先依次遍历根结点的每棵子树,遍历子树时仍遵循先子树后根的规则。
  • 再访问根结点。

其遍历序列与这棵树相应二叉树的中序序列相同。

图5.23 的树的先根遍历序列为ABEFCDG,后根遍历序列为 EFBCGDA。

另外,树也有层次遍历,与二叉树的层次遍历思想基本相同,即按层序依次访问各结点。

3.2森林的遍历

按照森林和树相互递归的定义,可得到森林的两种遍历方法。

1) 先序遍历森林。若森林为非空,则按如下规则遍历:

  • 访问森林中第一棵树的根结点。
  • 先序遍历第一棵树中根结点的子树森林。
  • 先序遍历除去第一棵树之后剩余的树构成的森林。

2) 中序遍历森林。森林为非空时,按如下规则遍历:

  • 中序遍历森林中第一棵树的根结点的子树森林。
  • 访问第一棵树的根结点。
  • 中序遍历除去第一棵树之后剩余的树构成的森林。

图5.24的森林的先序遍历序列为ABCDEFGHI,中序遍历序列为 BCDAFEHIG。

命题追踪——森林与二叉树遍历方法的对应关系

当森林转换成二叉树时,其第一棵树的子树森林转换成左子树,剩余树的森林转换成右子树,可知森林的先序和中序遍历即为其对应二叉树的先序和中序遍历。
树和森林的遍历与二叉树的遍历关系见表。

森林二叉树
先根遍历

先序遍历

先序遍历
后根遍历中序遍历中序遍历

注意:部分教材也将森林的中序遍历称为后序遍历,称中序遍历是相对其二叉树而言的,称后序遍历是因为根确实是最后才访问的,若遇到这两种称谓,则可理解为同一种遍历方法。

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

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

相关文章

开源推荐榜【FunClip是一款完全开源、本地部署的自动化视频剪辑工具】

FunClip是一款完全开源、本地部署的自动化视频剪辑工具,通过调用阿里巴巴通义实验室开源的FunASR Paraformer系列模型进行视频的语音识别,随后用户可以自由选择识别结果中的文本片段或说话人,点击裁剪按钮即可获取对应片段的视频(…

zookeeper安装集群模式

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 ZooKeeper是一个分…

JeeSite V5.7.0 发布,Java快速开发平台,Vite5、多项重构重磅升级

JeeSite V5.7.0 发布,Java快速开发平台,Vite5、多项重构重磅升级 升级内容 新增 参数配置 IP 地址黑白名单过滤器动态参数 新增 侧边栏是否展开第一个菜单的开关 first-open 新增 AesTypeHandler 处理字段数据加密解密或脱敏 新增 JsonTypeHandler …

247 基于matlab的梁的振型仿真

基于matlab的梁的振型仿真。利用有限元理论,求二维梁的固有频率和振型。短边固定,给定长度、横截面积,弹性模量及材料密度已知。并对比理论计算结果进行分析。各参数自己设定。程序已调通,可直接运行。 247 梁的振型仿真 固有频率…

Linux环境下parted工具使用

在工作中,我们经常会遇到大于分区大于2T的磁盘,由于系统盘最大不能超2T,我们会在做raid时将划分VD来进行装系统,但系统自动安装后无法将磁盘全部识别出来,管理员有时会要求手动对分区进行挂载,这个文档介绍…

收放卷伺服控制系统详细算法介绍(电子齿轮+张力PID卷绕轴控制功能块)

收放卷控制系统涉及的内容非常多,这里我们介绍全伺服系统利用电子齿轮指令实现主从轴的比例随动速度控制,收放卷控制算法介绍常用链接如下 1、收放卷+排线控制 收放卷+排线控制系统框图-CSDN博客文章浏览阅读24次。1、收放卷前馈量计算FC收放卷前馈量计算FC(CODESYS ST源代…

将python库下载到本地安装—Pypi官网wheel版本选择详解—小白详解版

python库—本地安装文件下载🚀 在项目中需要在内网环境下配置python的环境,因此需要将用于安装python库的文件下载到本地传到内网环境当中然后再安装,通过这契机我开始了解了一下如何离线下载安装python的第三方库,以及配置本地的…

【Docker】Ubuntu下Docker的基本使用方法与常用命令总结

【Docker】docker的基本使用方法 镜像image与容器container的关系基本命令- 查看 Docker 版本- 拉取镜像- 查看系统中的镜像- 删除某个镜像- 列出当前 Docker 主机上的所有容器,包括正在运行的、暂停的、已停止的,以及未运行的容器- 列出当前 Docker 主机…

Matlab 验证 复数的幂计算规则

复数的幂计算规则 close all a9; b0:0.1:5;result1 exp(1j*2*pi*a.*b); result2 (exp(1j*2*pi*a)).^b; idxfind(result1result2); b_idxb(idx);figure plot(b,angle(result1(:)),-r*) hold on plot(b,angle(result2(:)),bo) grid on

C++内存管理(1)

目录 1.new用法说明 2.new/delete在栈里面的运用 3.operator new/operator delete函数 4.构造函数的显式调用 5.malloc&&new&&free&&delete区别 1.new用法说明 (1)在C语言阶段,我们无论是为数组开辟空间&#x…

Disk Map for Mac,让您的Mac更“轻”松

还在为Mac磁盘空间不足而烦恼吗?Disk Map for Mac来帮您轻松解决!通过独特的TreeMap视觉显示技术,让您一眼就能看出哪些文件和文件夹占用了大量空间。只需简单几步操作,即可快速释放磁盘空间,让您的Mac更“轻”松。快来…

STL-Hashtable

hashtable hashtable是通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,这样在查找的时候就可以很快的找到该元素。 哈希函数 哈希函数的定义域必须包括需要存储的全部关键码,而如果散列表允许有m个地址时&#xff0c…

Web UI自动化测试--PO模式

没有PO实现的测试用例的问题: 重用性低:登录功能重复可维护性差:数据和代码混合可读性差:元素定位方法杂乱(id、xpath、css混杂)可读性差:不易识别操作的含义(特别是css和xpath语法)可维护性差:如果某个元素的属性改了,你要更改多次PO(Page Object Model)页面对象模型…

Linux 第二十八章

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…

C# SolidWorks 二次开发 -从零开始创建一个插件(3) 发布插件

五一节过完了吧,该上班学习了吧? 如何把自己开发好的程序优雅的给别人使用。 今天我们来简单讲解一下,这个之前不少粉丝咨询过相关问题,自己开发好的东西,如何给同事或者其它人使用。 先列一下使用到的主要工具&am…

计算机毕业设计】springbootBBS论坛系统

本系统为用户而设计制作 BBS论坛系统,旨在实现BBS论坛智能化、现代化管理。本BBS论坛自动化系统的开发和研制的最终目的是将BBS论坛的运作模式从手工记录数据转变为网络信息查询管理,从而为现代管理人员的使用提供更多的便利和条件。使BBS论坛系统数字化…

SpringCloud使用Nacos作为配置中心实现动态数据源切换

一、Nacos-Server 了解Nacos可以直接阅读官方文档 使用Nacos,我们需要有Nacos-Server,此处就不使用官方提供的release版本了,而是自己编译,因为本来就是Java开发的,所以对于Javaer来说也没啥难度! git c…

解决NVM 下载node.js慢问题->最新镜像

一、NVM 介绍 nvm是node版本管理工具,可以运行在多种操作系统上。这里主要记录一下在windows系统的安装和使用。 在使用过程中,下载其他版本时会出现下载慢或卡住或下载失败的情况,是因为服务器在国外,网络原因导致,…

【神经网络】输出层的设计

文章目录 前言一、恒等函数和softmax函数恒等函数softmax 函数python实现softmax函数 二、实现softmax函数时的注意事项函数优化python实现 三、softmax函数的特征计算神经网络的输出输出层的softmax函数可以省略“学习”和“推理”阶段 四、输出层的神经元数量 前言 神经网络…

03.Linux文件操作

1.操作系统与Linux io框架 1.1 io与操作系统 1.1.1 io概念 io 描述的是硬件设备之间的数据交互,分为输⼊ (input) 与输出 (output)。 输⼊:应⽤程序从其他设备获取数据 (read) 暂存到内存设备中;输出:应⽤程序将内存暂存的数据…