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

文章目录

树、森林

考纲内容

复习提示

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。

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

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

森林二叉树
先根遍历

先序遍历

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

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

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

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

相关文章

手机电脑通用便签推荐 好用便签下载

便签软件作为一种日常记录和管理工具,其实用性和便捷性深受用户喜爱。一款优秀的便签软件不仅能帮助我们随时随地记录重要信息,还能有效提高工作效率。然而,市场上很多便签应用仅限于单一平台使用,对于需要在手机和电脑间频繁切换…

FPGA第1篇,FPGA现场可编程门阵列,从0开始掌握可编程硬件开发(FPGA入门指南)

简介:FPGA全称Field-Programmable Gate Array,是一种可编程逻辑器件,它通过可编程的逻辑单元和可编程的连接网络实现了灵活的硬件实现。与固定功能的集成电路(ASIC)相比,FPGA具有更高的灵活性和可重新配置性…

python随机显示四级词汇

python实现一个浮动窗口随机显示四级单词在桌面跑来跑去 实现一个浮动窗体随机显示四级单词在windows桌面置顶移动 tkinter库来创建窗口和显示单词,以及random库来随机选择单词。 使用after方法来定时更新窗口的位置,实现单词窗口的慢慢移动效果 使用…

day10-Map集合

Map 1.Map 1.1 Map简介 1.为什么使用Map集合 购物车提供的四个商品和购买的数量在后台需要容器存储。 每个商品对象都一一对应一个购买数量。 把商品对象看成是Map集合的键,购买数量看成Map集合的值。 例如: {商品12 , 商品23 , 商品3 2 , 商品4…

GitHub操作

远程库-GitHub GitHub网址 GitHub是全球最大的远程库 1. 创建远程库 2. 远程仓库操作 2.1 创建远程仓库别名 git remote -v 查看当前所有远程库地址别名 git remote add 别名 远程地址 设置远程库地址别名 案例操作 起一个别名会出现两个别名,是因为既可以拉取…

第二步->手撕spring源码之bean操作

本步骤目标 本步骤继续完善 Spring Bean 容器框架的功能开发,在这个开发过程中会用到较多的接口、类、抽象类,它们之间会有类的实现、类的继承。 这一次我们把 Bean 的创建交给容器,而不是我们在调用时候传递一个实例化好的 Bean 对象&#x…

vue3使用setup模式的store报错

** setup store模式 $reset方法报错 ** 顾名思义就是 使用store 使用的是setup 语法模式 不能执行$reset 方法 解决方式: // main.ts import { createPinia } from pinia const pinia createPinia() pinia.use(({ store }) > {const initialState JSON.pars…

JupyterLab OpenCV展示图片

JupyterLab OpenCV展示图片 方式一 注意:此种方式如果在远程服务器上的JupyterLab上运行,可能会出现错误。 import cv2# 读取图片 image cv2.imread(photo/blg.png)# 显示图片 cv2.imshow(image, image)# 等待按键,之后关闭所有窗口 cv2.w…

c语言题库之多个数组从两边移动向中间汇聚

文章目录 题目分析代码实现代码分析 题目 c语言题库之多个数组从两边移动向中间汇聚 呈现效果:输入想要输入的字符数组呈现数组从两边向中间逐渐打开的样子 分析 首先我们需要一组我们想要输入的字符数组用来展示打开的字符其次我们需要进行对数组的替换&#x…

基于STM32单片机的环境监测系统设计与实现

基于STM32单片机的环境监测系统设计与实现 摘要 随着环境污染和室内空气质量问题的日益严重,环境监测系统的应用变得尤为重要。本文设计并实现了一种基于STM32单片机的环境监测系统,该系统能够实时监测并显示室内环境的温湿度、甲醛浓度以及二氧化碳浓…

怎么把学浪课程视频下载到相册

在这个快节奏的学习时代,每一刻的知识获取都显得至关重要。想象一下,在浩瀚如海的学浪app中,你已经找到了那些能够点亮智慧的课程视频,它们不仅充满了启发,还是你求学旅途中的宝贵资源。但是,在网络不稳定或…

Unity2D 模拟手柄实现玩家移动

1,创建控制器UI 2,挂载脚本 3,脚本编写 基本要素 [Tooltip("玩家游戏体")]public Rigidbody2D player;[Tooltip("玩家速度")]public float speed 1f;[Tooltip("玩家动画")]public Animator animator;public …

Docker in Docker(DinD)原理与实战

🐇明明跟你说过:个人主页 🏅个人专栏:《Docker幻想曲:从零开始,征服容器宇宙》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、Docker简介 2、Docker …

MES系统与WMS集成方法(满分100学习资料)

导语 大家好,我是智能仓储物流技术研习社的社长,老K。专注分享智能仓储物流技术、智能制造等内容。 新书《智能物流系统构成与技术实践》 完整版文件和更多学习资料,请球友到知识星球【智能仓储物流技术研习社】自行下载 这份文件是关于MES系…

什么是XXE漏洞,日常如何做好web安全,避免漏洞威胁

随着网络技术的不断发展,网站安全问题日益受到人们的关注。当前随着技术发展,网站存在一些常见的可能被攻击者利用的漏洞,而在众多网站安全漏洞中,XXE(XML External Entity)漏洞是一个不容忽视的问题。今天…

多线程·线程状态

目录 1.等待一个线程 join 2.休眠当前线程 3.线程的所有状态 4.线程的状态转换 1.等待一个线程 join 有些场景,我们需要控制线程的执行顺序,这时候就需要用到 join 了 比如:把大象装进冰箱要几步? 第一步:打开冰…

QT ERROR: Unknown module(s) in QT: xlsx怎么办

现象描述 QT编译c代码的时候,报这种QT ERROR: Unknown module(s) in QT: xlsx,应该如何解决? 这里,我简单记录一下自己的解决问题过程。有可能,对遇到同样的问题的你,也有所帮助 第一步 检查perl是否安装…

软考144-下午题-【试题三】:UML图-类图、用例图

一、分值与目标 题型: 问题一~问题三(扩展/UML——>设计模式) 二、UML基础知识回顾 2-1、关系 UML中有四种关系:依赖、关联、泛化、实现。 1、关联 关联是一种结构关系,它描述了一组链,链是对象之间的…

【计算机网络篇】数据链路层(10)在物理层扩展以太网

文章目录 🍔扩展站点与集线器之间的距离🛸扩展共享式以太网的覆盖范围和站点数量 🍔扩展站点与集线器之间的距离 🛸扩展共享式以太网的覆盖范围和站点数量 以太网集线器一般具有8~32个接口,如果要连接的站点数量超过了…

JAVA毕业设计138—基于Java+Springboot+Vue的医院预约挂号小程序(源代码+数据库)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的医院预约挂号小程序(源代码数据库)138 一、系统介绍 本系统前后端分离带小程序和后台 小程序(用户端),后台管理系统&a…