数据结构之树和森林

数据结构之树和森林

  • 1、树的存储结构
  • 2、树和森林的遍历
    • 2.1、树的遍历
    • 2.2、森林的遍历
  • 3、树、森林和二叉树之间的相互转换

  数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所涉及的数据选择适当的逻辑结构、存储结构及其相应的操作方法,为提高利用计算机解决问题的效率服务。
  数据结构是指数据元素的集合及元素间的相互关系和构造方法。元素之间的相互关系是数据的 逻辑结构,数据元素及元素之间关系的存储称为 存储结构(或物理结构)。数据结构按照逻辑关系的不同分为 线性结构非线性结构两大类,其中,非线性结构又可分为树结构和图结构。
  树结构是一种非常重要的非线性结构,该结构中的一个数据元素可以有两个或两个以上的直接后继元素,树可以用来描述客观世界中广泛存在的层次结构关系。

1、树的存储结构

  常用的树的存储有双亲表示法、孩子表示法和孩子兄弟表示法。
  (1)双亲表示法。该表示法用一组地址连续的单元存储树的结点,并在每个结点中附设一个指示器,指出其双亲结点在该存储结构中的位置(即结点所在数组元素的下标)。显然,这种表示法对于求指定结点的双亲和祖先都十分方便,但对于求指定结点的孩子及后代则需要遍历整个数组,树的双亲表示法如下图所示。
在这里插入图片描述

  (2)孩子表示法。该表示法在存储结构中用指针指示出结点的每个孩子,为树中每个结点的孩子建立一个链表,即令每个结点的所有孩子结点构成一个用单链表表示的线性表,则n个结点的树具有 n 个单链表。将这 n 个单链表的头指针又排成一个线性表,如下图(a) 所示。显然,树的孩子表示法便于查找每个结点的子孙,若要找出指定结点的双亲则可能需要遍历所有的链表。
在这里插入图片描述

  用户也可以将双亲表示法和孩子表示法结合起来,形成树的双亲孩子表示结构,如上图(b) 所示。
  (3)孩子兄弟表示法。孩子兄弟表示法又称为二叉链表表示法,它在链表的结点中设置两个指针域分别指向该结点的第一个孩子和下一个兄弟,如下图 所示。
在这里插入图片描述

  树的孩子兄弟表示法为实现树、森林与二叉树之间的转换提供了可能,充分利用二叉树的有关算法来实现树及森林的操作,对难以把握规律的树和森林有着重要的现实意义。

2、树和森林的遍历

2.1、树的遍历

  由于树中的每个结点可以有多个子树,因此遍历树的方法有两种,即先根遍历和后根遍历。
  (1)树的先根遍历。树的先根遍历是先访问树的根结点,然后依次先根遍历根的各棵子树。对树的先根遍历等同于对转换所得的二叉树进行先序遍历。
  (2)树的后根遍历。树的后根遍历是先依次后根遍历树根的各棵子树,然后访问树根结点。树的后根遍历等同于对转换所得的二叉树进行中序遍历。

2.2、森林的遍历

  按照森林和树的相互递归定义,可以得出森林的两种遍历方法。
  (1)先序遍历森林。若森林非空,首先访问森林中第一棵树的根结点,然后先序遍历第一棵树根结点的子树森林,最后先序遍历除第一棵树之外剩余的树所构成的森林。
  (2)中序遍历森林。若森林非空,首先中序遍历森林中第一棵树的子树森林,然后访问第一棵树的根结点,最后中序遍历除第一棵树之外剩余的树所构成的森林。

3、树、森林和二叉树之间的相互转换

  树、森林和二叉树之间可以互相进行转换,即任何一个森林或一棵树可以对应表示为一棵二叉树,而任何一棵二叉树也能对应到一个森林或一棵树上。
  (1)树、森林转换为二叉树。利用树的孩子兄弟表示法可导出树与二叉树的对应关系,在树的孩子兄弟表示法中,从物理结构上看与二叉树的二叉链表表示法相同,因此就可以用这种同一存储结构的不同解释将一棵树转换为一棵二叉树,如下图 所示。一棵树可转换成唯一的一棵二叉树。
在这里插入图片描述

  由于树根没有兄弟,所以树转换为二叉树后,二叉树的根一定没有右子树。这样,将一个森林转换为一棵二叉树的方法是: 先将森林中的每一棵树转换为二叉树,再将第一棵树的根作为转换后的二叉树的根,第一棵树的左子树作为转换后二叉树根的左子树,第二棵树作为转换后二叉树的右子树,第三棵树作为转换后二叉树根的右子树的右子树,依此类推,森林就可以转换为一棵二叉树,如下图所示。
在这里插入图片描述

  (2)二叉树转换为树和森林。一棵二叉树可转换为唯一的树或森林,如下图所示
在这里插入图片描述

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

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

相关文章

一键拥有你的GPT4

这几天我一直在帮朋友升级ChatGPT,现在已经可以闭眼操作了哈哈😝。我原本以为大家都已经用上GPT4,享受着它带来的巨大帮助时,但结果还挺让我吃惊的,还是有很多人仍苦于如何进行升级。所以就想着写篇教程来教会大家如何…

记录xxl-job重复执行引发业务问题

业务问题描述 1.创建运单,发现重复(同一个车架号两条记录) 2.通知重复反馈,A系统读取中间表状态为未处理数据,推送到B系统 原因分析 1.以上两个问题都是xxljob定时执行的 2.通过日志分析,读取中间表数…

pcl之滤波器(一)

pcl滤波器 pcl一共是有十二个主要模块,详细了解可以查看官网。https://pcl.readthedocs.io/projects/tutorials/en/latest/#basic-usage 今天学习一下pcl的滤波器模块。 滤波器模块,官网一共是提供了6个例程,今天先来看第一第二个。 直通…

01 Aras Innovator二次开发说明

在进行Aras Innovator二次开发之前,需要先了解Aras的服务器架构以及相关的方法论。 了解这部分内容后,有助于我们进行二次开发。 一. 服务器架构 参考下表: Aras Innovator为B/S架构,支持主流的浏览器(IE Edge,Firefox,Google)…

Labview for循环精讲

本文详细介绍Labview中For循环的使用方法,从所有细节让你透彻的看明白For循环是如何使用的,如果有帮助的话记得点赞加关注~ 1. For循环结构 从最简单的地方讲起,一个常用的for循环结构是由for循环结构框图、循环次数、循环计数(i)三部分组成…

Linux版本下载Centos操作

目录 一、Centos7 二、下载Centos7镜像 三、下载Centos7 买了个硬件安装裸机(一堆硬件) 把安装盘放到虚拟机里面,给机器加电 配置设置 ​编辑 网络配置 开启网络功能 四、安装linux客户端 Xshell是什么 Xshell使用(连接…

构建一个安全可靠的身份认证中心和资源服务中心:SpringSecurity+OAuth2.0的完美结合

目录 1、引言 1.1 身份认证和授权的重要性 1.2 SpringSecurity和OAuth2.0的概述 2、架构设计 2.1 组件概述 2.2 身份认证中心的设计 2.3 资源服务中心的设计 3、身份认证中心的实现 3.1 用户管理 3.2 登录认证流程 3.3 令牌生成和管理 4、资源服务中心的实现 4.1 …

新版idea创建spring boot项目

目录 前言 汉化教程 项目模板初始化 1.点击新建项目 2.配置初始化信息 3.初始依赖选择 配置Maven 1.打开maven设置 2.重写maven配置文件 3.选择你创建的配置文件 4.重启项目 spring boot配置并测试 1.修改配置文件后缀 2.启动项目 3.编写测试控制类 4.重启项目…

idea引入jar包作为maven

1.引入jar包至项目中 2.配置当前项目的maven(如果只想在本机能运行的话,到这一步就够了,后面pom配置也不需要这一步) 3.配置文件的maven依赖路径 这里的 groupId 就是你引入原包的包路径,artifactId、version都是随…

【动态规划】【字符串】【C++算法】940. 不同的子序列 II

作者推荐 【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径 本文涉及知识点 动态规划汇总 LeetCode940. 不同的子序列 II 给定一个字符串 s,计算 s 的 不同非空子序列 的个数。因为结果可能很大,所以返回答案需要对 10^9 7 取…

企业如何用copilot?电通×Copilot:打破创意工作效率“天花板”

企业申请Azure OpenAI绿色通道 →记得评论私信~还可加入试用交流群~ 电通集团拥有着120年的历史、汇聚了七万多名精英,是全球顶级的创意公司之一。随着新兴传播渠道的不断涌现,电通的客户们面临着内容需求的挑战。好消息是,微软Copilot为电通…

21.云原生之GitLab pipline语法(CI基础)

云原生专栏大纲 文章目录 gitlab-ci.yml 介绍GitLab中语法检测gitlab-ci.yml 语法job定义作业before_script和after_scriptstages定义阶段tages指定runnerallow_failure运行失败when控制作业运行retry重试timeout超时parallel并行作业only & exceptrulescache 缓存cache:p…

路灯哪个牌子质量好?适合学生备考使用的台灯分享

落地台灯是一种常见的家居照明设备,通常由支架、灯头和灯罩组成。其特点是可以放置在地面上,提供直接的照明效果,适用于客厅、卧室、书房等各种生活空间。落地台灯的设计风格多样,可以选择简约现代、北欧风格、复古风格等等&#…

在PyCharm中安装GitHub Copilot插件,login之后报出如下错误:

Sign in failed. Reason: Request signInInitiate failed with message: connect ECONNABORTED 20.205.243.166:443, request id: 7, error code: -32603 前提: 设置网址:https://github.com/settings/copilot,已设置为允许 或者&#xff1…

每日一题——LeetCode1313.解压缩编码列表

这么简单的题目要说的这么复杂 nums里每相邻的两个元素nums[i]、nums[j]为一对&#xff0c;nums[i]表示nums[j]的次数 var decompressRLElist function(nums) {let res[]for(let i0,j1;j<nums.length-1;i2,j2){while(nums[i]--){res.push(nums[j])}}return res }; 消耗时…

K8S四层代理Service-02

Service的四种类型使用 ClusterIP使用示例Pod里使用service的服务名访问应用 NodePort使用示例 ExternalName使用示例 LoadBalancer K8S支持以下4种Service类型&#xff1a;ClusterIP、NodePort、ExternalName、LoadBalancer 以下是使用4种类型进行Service创建&#xff0c;应对…

shell脚本——变量

目录 一、变量基础 1、shell脚本的变量是什么 2、变量的作用 3、变量作用范围 3.1 临时设置 3.2 永久设置&#xff0c;需要在/etc/profile文件里添加 4、删除变量 二、变量的类型 1、自定义变量 1.1 命令要求 1.2 定义新的变量 1.3 查看定义的变量的值 1.4 赋值时使…

Confluence6+mysql5.7破j安装避坑详细记录

目录 一、前言 二、下载与安装 1、版本和安装环境 2、安装数据库 3、配置数据库 4、安装confluence 三、Pj confluence 1、选择语言和产品安装 2、Pj 3、上传mysql驱动 4、重启Confluence服务继续安装 四、Confluence重启卸载方法 重启方法 方法一 方法二 卸载…

【JSON显示】

1、效果 2、代码 <pre>{/* * networkObj&#xff1a; 要转换的对象* null: 转换结果的函数* 2&#xff1a;在返回值的JSON文本中添加缩进&#xff0c;空格和换行符&#xff0c;使其更容易阅读*/}{JSON.stringify(networkObj, null, 2)} </pre>

ubuntu1604安装及问题解决

虚拟机安装vmbox7 虚拟机操作&#xff1a; 安装增强功能 sudo mkdir /mnt/share sudo mount -t vboxsf sharefolder /mnt/share第一次使用sudo提示is not in the sudoers file. This incident will be reported 你的root需要设置好密码 sudo passwd root 输入如下指令&#x…