树、森林与二叉树的相互转换和遍历
文章目录
- 前言
- 一、树的存储结构----二叉链表法
- 图示
- 代码示例
- 二、树与二叉树的相互转换
- 树转化为二叉树
- 二叉树转换为树
- 三、森林与二叉树的相互转换
- 森林转换为二叉树
- 二叉树转换为森林
- 四、树的遍历
- 先根遍历
- 后根遍历
- 实例
- 五、森林的遍历
- 先序遍历森林
- 中序遍历森林
- 实例
- 总结
前言
本文章主要是介绍树、森林和二叉树的相互转化和遍历。
在介绍之前,首先会介绍树的一种存储结构二叉链表法,又叫孩子兄弟表示法。
提示:以下是本篇文章正文内容,下面案例可供参考
一、树的存储结构----二叉链表法
该表示方法以二叉链表作为树的存储结构。链表中结点的两个链域分别指向该结点的第一个孩子和下一个兄弟结点,分别命名为firstchild域和nextsibling域。
图示
代码示例
typedef struct CSNode {ElemType data;struct CSNode *firstchild, *nextsibling;
} CSNode, *CSNode;
介绍完成,利用这种存储结构便于实现各种树的操作,接下来让我们进入正题
二、树与二叉树的相互转换
利用实例来简述树与二叉树的转换
树转化为二叉树
如图有树
(1)加线:在树兄弟结点之间依次加连线。
(2)抹线:对每个结点,除了其左孩子(第一个孩子)外,去掉其与其余孩子之间的关系。
(3)旋转:以树的根结点为轴心,将整棵树顺时针旋转。
注意:转换之后的二叉树的根节点的右子树一定为空,原来树中兄弟关系转换为了二叉树中双亲与右孩子的关系。
二叉树转换为树
将上题二叉树转换为树
(1)加线:若某结点是双亲结点的左孩子,则将该结点的右孩子,右孩子的右孩子,以及沿分支找到的所有右孩子,都与该节点用线连起来。
(2)抹线:抹掉原二叉树中双亲与右孩子之间的连线。
(3)调整:将根结点按层次排列,形成树结构。
三、森林与二叉树的相互转换
森林转换为二叉树
森林如下
(1)将森林中的各棵树分别转化为二叉树。
(2)将每棵二叉树的根结点用线相连。
(3)以第一棵树根结点为二叉树的根,再以根结点为轴心,顺时针旋转,构成二叉树型结构。
二叉树的根及其左子树来源于第一棵树;根的右孩子及其左子树来源于第二棵树;而根的右孩子的右孩子及其左子树则来源于第三棵树。
二叉树转换为森林
将上题二叉树转换为森林
(1)通过抹线进行分割:将二叉树中根结点与其右孩子连线,及沿右分支搜索到的所有右孩子间的连线全部抹掉,使之变成孤立的二叉树。
(2)利用二叉树转换为树的方法分别将孤立的二叉树还原成树,从而形成森林。
四、树的遍历
树的遍历要规定根与子树的访问次序,可以分为先根遍历和后根遍历
先根遍历
先根遍历的具体操作:
若树为空,则空操作;
否则,树非空时,按以下两步处理(递归处理)
(1)首先,访问树的根结点;
(2)然后依次先根遍历每棵子树。
后根遍历
后根遍历的具体操作:
若树为空,则空操作;
否则,树非空时,按以下两步处理(递归处理)
(1)首先依次先根遍历每棵子树;
(2)然后访问树的根结点;
实例
对于该树
先序遍历为:ABEHICFGJD
后序遍历为:HIEBFJGCDA
五、森林的遍历
按照森林与树相互递归的定义,我们可以推出森林的两种遍历方式:先序遍历森林和中序遍历森林。
先序遍历森林
若森林为空,则空操作,否则
(1)访问森林中第一棵树的根节点;
(2)先序遍历第一棵树中根节点的子树森林;
(3)先序遍历除去第一棵树之后剩余的树构成的森林。
中序遍历森林
若森林为空,则空操作,否则
(1)中序遍历森林中第一棵树的根结点的子树森林;
(2)访问第一棵树的根结点;
(3)中序遍历除去第一棵树之后剩余的树构成的森林。
实例
对于该森林
先序遍历森林:ABCDEFGHIKJ
中序遍历森林:BCDAFGEKIJH
总结
以上就是本文全部的内容了,本文仅仅简单粗略的介绍了树的一种存储结构——二叉链表法(孩子兄弟法)、树与二叉树的相互转换、森林与二叉树的相互转换以及树和森林的遍历方法。
树、森林与二叉树的相互转换和遍历相关推荐
- 树、森林与二叉树的相互转换
设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为M1,M2和M3.与森林F对应的二叉树根结点的右子树上的结点个数是( ) A)M1 B)M1+M ...
- 树与树算法二叉树的层次遍历/广度遍历/深度遍历详解与代码实现
一. 树与树算法 1.1树的概念 树(tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>=1)个有限节点组成一个具有 ...
- 数据结构——树、森林、二叉树的转换
树.森林与二叉树的转换 树转换二叉树 规则:左孩子右兄弟,每个结点左指针指向它的第一个孩子结点,右指针指向它在树中相邻兄弟结点. 二叉树转换为树 规则: 逆过程,将指针修改回来,指向其双亲结点. 森林 ...
- 二叉树之前序遍历、中序遍历、后续遍历
刷leetcode的时候,看到三道题:145. 二叉树的后序遍历.94. 二叉树的中序遍历.144. 二叉树的前序遍历.正好趁着这三道题,回顾一下二叉树的遍历算法. 二叉树的前序遍历:先遍历根,再遍历 ...
- 树/二叉树/森林之间的相互转换 与遍历
森林就是多棵树的集合,但是森林也可以只有一棵树,二叉树是一种特殊的树,固定的度为2,这是基本前情提要- 树常见的存储方式有三种: (1)双亲表示法 仅用定义一个结点对象,一个数组,代码定义如下: ty ...
- [数据结构]树、森林与二叉树之间的相互转换方法
树.二叉树与森林的相互转换 本文只给出树.森林与二叉树之间的转换方法,而详细的证明过程不在本文讨论范围之内. 树 → 二叉树 在所有兄弟结点之间加一连线. 对每个结点,除了保留与其长子的连线外,去掉该 ...
- 树和森林与二叉树的转换、树和森林的遍历
全部数据结构.算法及应用课内模板请点击:https://blog.csdn.net/weixin_44077863/article/details/101691360 树和森林转二叉树其实十分简单,我 ...
- 树、森林与二叉树的转换
我们惊人的发现:树.森林的前跟遍历和二叉树的前序遍历结果相同:树.森林的后跟遍历和二叉树的中序遍历结果相同! 参考资料:http://www.cnblogs.com/xxiaoye/p/3642533 ...
- 树和二叉树(四种遍历,建树)详解+二叉排序树(包含图像和相关习题)
目录 树和二叉树 一.树 2.有序树和无序树 3.森林 4.树的基本性质 二.二叉树的概念 (1)二叉树的编号 1.二叉树和度为2的有序树的区别: 2.满二叉树 3.完全二叉树: 4.平衡二叉树: 5 ...
最新文章
- 虚拟化中的SR-IOV
- mysql 类似 user__类似于微博 用户最后一条动态的查询
- 架构师之路 — 分布式系统 — CAP 定理
- OpenCV像素点处理 1
- php 提交表单跳转页面,form表单页面跳转方式提交练习
- Rolling The Polygon Gym - 102222B
- 专访微软Greg Yang,构建神经网络的底层语言,探索AI的“万物理论”
- mysql 8.0.25 取巧解决修改密码报错问题
- mysql 5.1升级5.6_mysql 5.1.71升级到5.6.30
- 深层剖析鸿蒙轻内核M核的动态内存如何支持多段非连续性内存
- 不用掉一根头发!用 Flutter + Dart 快速构建一款绝美移动 App
- 【路径规划】基于matlab粒子群算法栅格地图路径规划【含Matlab源码 579期】
- BaseRecyclerViewAdapterHelper开源项目之BaseSectionQuickAdapter 实现Expandable And collapse效果的源码学习...
- win10系统如何安装SQL2008?
- go语法 — 多路选择操作符 select的用法
- 股票中,什么是滚动市盈率,有什么作用?
- TestNG - 运行失败的test
- linux新增加swap空间,Linux增加swap空间的方法
- 申万一级行业指数是什么?
- 关于send和recv在UDP的使用