数据结构——树、二叉树和森林间的转换

前言

介绍

 🍃数据结构专区:数据结构

参考

该部分知识参考于《数据结构(C语言版 第2版)》129~130页

🌈每一个清晨,都是世界对你说的最温柔的早安:ૢ(≧▽≦)و✨


目录

前言

1、基础知识

2、树转换为二叉树

2.1 方法介绍:

2.2 演示

3、森林转换为二叉树

3.1 方法介绍:

3.2 演示

4、二叉树转换为树或森林

4.1 方法介绍:

4.2 演示 

结语


1、基础知识

  • 树的定义:是 n(n≥0)个结点的有限集合。当 n=0 时,称为空树;任意一棵非空树满足以下条件:  

        ⑴ 有且仅有一个特定的称为根的结点;

        ⑵ 当 n>1 时,除根结点之外的其余结点被分成 m(m>0)个互不相交的有限集合 T1,T2,…,Tm,其中每个集合又是一棵树,并称为这个根结点的子树。


  • 二叉树的定义:二叉树是 n(n≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。

  • 森林的定义:森林是 m(m≥0)棵互不相交的树的有限集合。该集合或者为空集(称为空森林),或者由 m 棵互不相交的树组成,其中每棵树本身又是一棵二叉树

2、树转换为二叉树

2.1 方法介绍:

加线——树中所有相邻兄弟结点之间加一条连线;

去线——对树中的每个结点,只保留它与第一个孩子结点之间的连线,删去它与其它孩子结点之间的连线;

层次调整——以根结点为轴心,将树顺时针转动一定的角度,使之层次分明。  

2.2 演示

首先这是一棵树

开始第一步,加线

随后进行第二步,删线

最后调整即可 

3、森林转换为二叉树

3.1 方法介绍:

⑴ 将森林中的每棵树转换成二叉树

⑵ 从第二棵二叉树开始,依次把一棵二叉树的根结点作为一棵二叉树根结点的右孩子,当所有二叉树连起来后,所得到的二叉树就是由森林转换的二叉树。

3.2 演示

这是一片森林

首先将每棵树都转换为二叉树

随后,从第二棵二叉树开始,将后一棵树的根节点,作为前一棵树的根节点的右孩子 

4、二叉树转换为树或森林

4.1 方法介绍:

加线——若某结点 x 是其双亲 y 的左孩子,则把结点 x 的右孩子、右孩子的右孩子、……,都与结 点 y 用线连起来;

去线——删去原二叉树中所有的双亲结点与右孩子结点的连线;

层次调整——整理由⑴、⑵两步所得到的树或森林,使之层次分明。 树的遍历序列与二叉树的遍历序列之间的对应关系 

4.2 演示 

首先是个二叉树

加线

去线 

调整

二叉树转森林,第一步是从根节点开始,若右孩子存在,就把与右孩子节点的连线删除 

剩余就是二叉树转树的步骤了


结语

这里我仅仅介绍了树和森林对于二叉树的转换,并没有介绍树和森林的遍历,对于遍历的文章我推荐这一篇文章

树和森林的遍历(动态演示) 

希望大家都有所收获!

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

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

相关文章

Qml-Button的使用

Qml-Button的使用 Button属性 Button的继承关系: Button – AbstractButton – Control – Item; Button的属性主要继承于AbstractButton。AbstractButton属性主要如下: a.action:是一个Action类型属性,与QAction类似,用于提供快…

【论文解读系列】EdgeNAT: 高效边缘检测的 Transformer

代码: https://github.com/jhjie/edgenat 论文: https://arxiv.org/abs/2408.10527v1 论文 EdgeNAT: Transformer for Efficient Edge Detection 介绍了一种名为EdgeNAT的基于Transformer的边缘检测方法。 1. 背景与动机 EdgeNAT预测结果示例。(a, b)…

c语言基础程序——经典100道实例。

c语言基础程序——经典100道实例 001, 组无重复数字的数002,企业发放的奖金根据利润提成003,完全平方数004,判断当天是这一年的第几天005,三个数由小到大输出006,输出字母C图案007,特殊图案008&…

【Petri网导论学习笔记】Petri网导论入门学习(七) —— 1.5 并发与冲突

导航 1.5 并发与冲突1.5.1 并发定义 1.14定义 1.15 1.5.2 冲突定义 1.17 1.5.3 一般Petri网系统中的并发与冲突定义 1.18一般网系统中无冲撞概念阻塞(有容量函数K的P/T系统,类似于冲撞)一般Petri网中并发与冲突共存情况 1.5 并发与冲突 Petr…

lstm基础知识

lstm前言 LSTM(Long short-term memory)通过刻意的设计来避免长期依赖问题,是一种特殊的RNN。长时间记住信息实际上是 LSTM 的默认行为,而不是需要努力学习的东西! 在标准的RNN中,这个重复模块具有非常简单的结构,例…

路由器原理和静态路由配置

一、路由器的工作原理 根据路由表转发数据 接收数据包→查看目的地址→与路由表进行匹配找到转发端口→转发到该端口 二、路由表的形成 它是路由器中维护的路由条目的集合,路由器根据路由表做路径选择,里面记录了网段ip地址和对应下一跳接口的接口号。…

【C语言备课课件】(下)指针pointer

目录 定义type *var_name;初始化int *p &a; // p指向变量a的地址 空指针NULL,野指针,指针悬挂 解引用指针的算术运算指针与数组 数组名—首指针二维数组指针 行指针列指针 多级指针(进阶)数组指针,指针数组(进阶&#xff09…

如何利用 Python抓取网页数据 其他方式抓取网页数据列举

在 Python 中可以使用多种方法抓取网页数据,以下是一种常见的方法,使用requests和BeautifulSoup库。 一、安装所需库 在命令提示符或终端中执行以下命令安装requests和BeautifulSoup库: pip install requests pip install beautifulsoup4二…

python——类

问:小编为什么突然开始发python?难道C语言你不行了? 废话少说,让我们进入python中的类的学习!! (一)基本知识 (1)掌握类的概念 1、类的定义: 即…

python安装transformer教程

本章教程,记录在Windows中如何使用python安装transformer。 一、安装依赖 pip install transformers推荐使用国内镜像源,速度会快很多。 二、测试代码 from transformers import pipeline# 加载一个文本生成模型 text_generator = pipe

LCWLAN设备的实际使用案例

我们的LCWLAN设备在实际使用中以裸板的形式放在客户的智能总线控制器中,客户的 智能总线刀片灯,柔性灯货架,柔性感应钢网柜以及智能电子料架等设备都是接到总线控制 器中,然后总控制器通过CAN总线和我们的LCWLAN设备连接&#xff…

Linux DEADLINE调度算法详解

介绍 在实时系统中,调度算法的选择对于任务的及时执行至关重要。为了满足实时性需求,Linux内核引入了不同的调度算法,其中 DEADLINE 调度算法是为硬实时任务而设计的。DEADLINE 调度算法的目标是在多任务的情况下确保任务在其指定的最后期限…

Cpp::STL—容器适配器Stack和Queue的讲解和模拟实现(15)

文章目录 前言一、适配器模式概念分类 二、Stack核心作用代码实现 三、Queue核心作用代码实现 四、deque双端队列貌似兼收并蓄?实则也难以兼得~ 总结 前言 适配器也是STL六大组件之一,请跟我一起领悟它的智慧!   正文开始! 一、…

如何实现简单的 WinCC 项目分屏?

说明: 本文主要介绍了在不使用分屏器的情况下,通过 WinCC 项目中的设置,实现简单的分屏操作。两台显示器分别显示不同的 WinCC 画面,独自操作,互不影响。 试验环境 : 本文试验时所用硬件及软件环境…

案例分享—国外优秀UI设计作品赏析

国外UI界面设计之所以出色,首要原因在于其注重用户体验。设计师们深入洞察用户需求,通过细致的用户调研和数据分析,确保界面布局、色彩搭配及交互方式都能贴合用户习惯,从而提供流畅、直观的操作体验,增强用户满意度和…

【MySQL】数据库基础、库的操作、表的操作、数据类型

目录 1. 数据库基础1.1 MySQL是什么1.2 使用案例1.3 服务器,数据库,表关系 2. 库的操作2.1 字符集和校验规则2.1.1 查看系统默认字符集以及校验规则2.1.2 查看数据库的字符集和校验规则2.1.3 修改数据库的字符集和校验规则 2.2 库的操作2.2.1 创建数据库…

c++算法第4天

本篇文章包含三道算法题&#xff0c;难度由浅入深&#xff0c;适合新手练习哟 第一题 题目链接 牛牛的快递_牛客题霸_牛客网 题目解析 <1kg -------> 20元 大于1kg&#xff1a;超出部分每千克1元 加急 5元 代码原理 代码编写 #include …

QT 实现自定义水波进度条

1.界面实现效果 以下是具体的项目需要用到的效果展示。 2.简介 原理:随着进度的改变,在我们的绘制图像void paintEvent(QPaintEvent *) override;事件中绘制图形。 使用QPainter来绘制正弦波,通过定时器,不断的更新我们绘制的图形,动态改变正弦波的参数来创建动画效果…

【从零开始的LeetCode-算法】3099. 哈沙德数

如果一个整数能够被其各个数位上的数字之和整除&#xff0c;则称之为 哈沙德数&#xff08;Harshad number&#xff09;。给你一个整数 x 。如果 x 是 哈沙德数 &#xff0c;则返回 x 各个数位上的数字之和&#xff0c;否则&#xff0c;返回 -1 。 示例 1&#xff1a; 输入&am…

提高阅读效率:三种读书笔记方法的实践

你是否曾经感到&#xff0c;尽管阅读了大量书籍&#xff0c;却很少有几本能够留下持久的印象&#xff0c;甚至书中的人物也逐渐从记忆中消失。实际上&#xff0c;这种阅读方式可能并没有太大的价值。要想真正从阅读中获益&#xff0c;培养良好的阅读习惯至关重要&#xff0c;而…