C/C++ 数据结构与算法【树和森林】 树和森林 详细解析【日常学习,考研必备】带图+详细代码

一、树的存储结构

1)双亲表示法实现:

定义结构数组存放树的结点,每个结点含两个域:

  • 数据域:存放结点本身信息。
  • 双亲域:指示本结点的双亲结点在数组中的位置。

在这里插入图片描述
在这里插入图片描述

特点:找双亲简单,找孩子难

C语言描述:

在这里插入图片描述

结点结构:

dataparent
typedef struct PTNode {TElemType data; int parent;     // 双亲位置域
} PTNode;
// 树的存储结构
#define MAX_TREE_SIZE 100
typedef struct {PTNode nodes[MAX_TREE_SIZE];int r n;     // 根结点的位置和结点个数
} PTree;

2)孩子链表

把每个结点的孩子结点排列起来,看成是一个线性表,用单链表存储,则 n 个结点有 n 个孩子链表(叶子的孩子链表为空表)而 n 个头指针又组成一个线性表,用顺序表(含 n 个元素的结构数组)存储。

在这里插入图片描述

特点:找孩子容易,找双亲难

C语言描述:

孩子结点结构:

childnext
typedef struct CTNode {int child;struct CTNode* next;
}*ChildPtr;

双亲结点结构:

datafirstchild
typedef struct {TElemType data;ChildPtr firstchild;// 孩子链表头指针
}CTBox;

树结构:

typedef struct {CTBox nodes[MAX_TREE_SIZE];int n, r;  // 结点数和根结点的位置
} CTree;

3)孩子兄弟表示法(二叉树表示法,二叉链表表示法)

实现:用二叉链表作树的存储结构,链表中每个结点的两个指针域分别指向第一个孩子结点下一个兄弟节点

在这里插入图片描述

typedef struct CSNode {ElemType data; struct CSNode * firstchild, * nextsibling;
}CSNode, *CSTree;

二、树与二叉树的转换

将树转化为二又树进行处理,利用二又树的算法来实现对树的操作。

由于树和二又树都可以用二叉链表作存储结构,则以二又链表作媒介可以导出树与二又树之间的一个对应关系。

在这里插入图片描述

1)将树转换成二叉树

  1. 加线:在兄弟之间加一连线。
  2. 抹线:对每个结点,除了其左孩子外,去除其与其余孩子之间的关系。
  3. 旋转:以树的根结点为轴心,将整树顺时针转45度。

口诀:

树变二叉树:兄弟相连留长子

在这里插入图片描述

2)将二叉树转换为树

  1. 加线:若 p 结点是双亲结点的左孩子,则将 p 的右孩子,右孩子的右孩子.……沿分支找到的所有右孩子,都与p的双亲用线连起来。
  2. 抹线:抹掉原二叉树中双亲与右孩子之间的连线。
  3. 调整:将结点按层次排列,形成树结构。

口诀:

二叉树变树:左孩右右连双亲,去掉原来右孩线

在这里插入图片描述

三、森林与二叉树的转换

1)森林转换成二叉树(二又树与多棵树之间的关系)

  1. 将各棵树分别转换成二叉树
  2. 将每棵树的根结点用线相连
  3. 以第一棵树根结点为二叉树的根,再以根结点为轴心,顺时针旋转构成二叉树型结构

口诀:

森林变二叉树:树变二叉根相连

在这里插入图片描述

2)二叉树转换成森林

  1. 抹线:将二叉树中根结点与其右孩子连线,及沿右分支搜索到的所有右孩子间连线全部抹掉,使之变成孤立的二又树
  2. 还原:将孤立的二又树还原成树

口诀:

二叉树变森林:去掉全部右孩线,孤立二叉再还原

在这里插入图片描述

四、树的遍历(三种方式)

在这里插入图片描述

五、森林的遍历

在这里插入图片描述

1)先序遍历

若森林不空,则

1、访问森林中第一棵树的根结点。

2、无序遍历森林中第一棵树的子树森林。

3、先序遍历森林中(除第一棵树之外)其余树构成的森林。

即:依次从左至右对森林中的每一个树进行先根遍历。

2)中序遍历

若森林不空,则

1、中序遍历森林中第一棵树的子树森林。

2、访问森林中第一棵树的根结点。

3、中序遍历森林中(除第一棵树之外)其余树构成的森林。

即:依次从左至右对森林中的每一个树进行后根遍历。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flask后端开发(11):User模型创建+注册页面模板渲染

目录 一、数据库创建和配置信息1.新建数据库2.数据库配置信息3.User表4.ORM迁移 二、注册页面模板渲染1.导入静态文件2.蓝图注册路由 一、数据库创建和配置信息 1.新建数据库 终端中 CREATE DATABASE zhiliaooa DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;2…

通过 Ansys Electronics Desktop 中的高级仿真优化 IC 设计

半导体行业继续通过日益复杂的集成电路 (IC) 设计突破技术界限。随着工艺节点缩小和电路密度达到前所未有的水平,电磁效应对设备性能和可靠性变得越来越重要。现代 IC 设计面临着来自复杂的布局相关耦合机制、信号完整性问题和功率分布问题的挑战,这些问…

Android OpenGl(二) Shader

一、Shader 1、什么是Shader,为什么要使用Shder (1)shader运行在gpu上的小程序 (2)以前使用固定管线,但缺点是灵活度不够,无法满足复杂需求,为了解决固定管线的缺点,出…

Vue(四)

1.Vuex 1.1 Vuex是什么 Vuex 是一个插件,可以帮我们管理 Vue 通用的数据。例如:购物车数据、个人信息数据。 1.2 vuex的使用 1.安装 vuex 安装 vuex 与 vue-router 类似,vuex 是一个独立存在的插件,如果脚手架初始化没有选 v…

【已解决】pyinstaller打包ico图片报错:OSError: [WinError 225] 无法成功完成操作,因为文件包含病毒或潜在的垃圾软件。

起因: pyinstaller加上 --icon 参数打包时报错。 命令如下: 解决: 关闭 Windows 的病毒防护即可,步骤如下。 点屏幕右下角通知栏,进入“病毒和威胁防护”: 打开: 关闭实时保护&#xff08…

多旋翼无人机理论 | 四旋翼动力学数学模型与Matlab仿真

多旋翼无人机理论 | 四旋翼动力学数学模型与Matlab仿真 力的来源数学模型数学模型总结Matlab 仿真 力的来源 无人机的动力系统:电调-电机-螺旋桨 。 给人最直观的感受就是 电机带动螺旋桨转,产生升力。 螺旋桨旋转产生升力的原因,在很多年…

Vue中动态样式绑定+CSS变量实现切换明暗主题功能——从入门到进阶

1.直接借助Vue的动态绑定样式绑定 Vue动态样式绑定 在Vue中,动态样式绑定是一种强大的功能,它允许开发者根据数据的变化动态地更新元素的样式。以下是对Vue动态样式绑定的详细知识梳理与详解: 一、基础知识 Vue的动态样式绑定主要通过v-b…

智能家居实训室中,STC单片机驱动的“互联网+”智能家居系统设计

一、引言 随着经济的快速发展,人们对家居环境的智能化、网络化需求日益增强,智能家居的研究也因此受到了国内外相关机构的广泛关注。STC单片机凭借其卓越的性能和广泛的应用领域,成为了智能家居系统设计的优选方案。作为一种先进的微控制器&…

计算机网络——期末复习(3)4-6章考试重点

第四章 根据IPv4第1个十进制数值判断,127以下为A类,128~191为B类,192~223为C类不能分配给主机或路由器接口的:A类网络号0和127,主机号全为0或全为1私有地址(Private IP Address)是指一类专门保…

内置ALC的前置放大器D2538A/D3308

一、概述 D2538A/D3308是芯谷科技推出的带有ALC(自动电平控制)的前置音频放大器芯片,最初产品为单声道/立体声收录机及盒式录音机而开发,作为录音/回放的磁头放大器使用;由于产品的高增益、低噪声及ALC外部可调的特性&…

【玩转MacBook】Git安装

Git 官网也提到了MacBook 可以使用 Homebrew 安装 Git,所以在此使用 Homebrew 安装。 1、安装 Homebrew 执行安装脚本 在 Terminal 中执行如下命令: /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.…

Speckly:基于Speckle文档的RAG智能问答机器人

前言 Speckly 是一个基于 检索增强生成 (RAG) 技术的智能问答机器人,它能像一位经验丰富的工程师,理解你的问题,并从 Speckle 文档中精准地找到答案。更厉害的是,它甚至可以帮你生成代码片段!🚀 本文将详…

Excel无法插入新单元格怎么办?有解决方法吗?

在使用Excel时,有时会遇到无法插入新单元格的困扰。这可能是由于多种原因导致的,比如单元格被保护、冻结窗格、合并单元格等。本文将详细介绍3种可能的解决方案,帮助你顺利插入新单元格。 一、消冻结窗格 冻结窗格功能有助于在滚动工作表时保…

电子配件行业的未来之路:产品说明书数字化转型的力量

在科技飞速发展的今天,电子配件行业作为科技创新的前沿阵地,正经历着前所未有的变革。从智能手机、平板电脑到智能穿戴设备,各种新型电子配件层出不穷,极大地丰富了人们的生活。然而,随着产品种类的增多和功能的复杂化…

Python+Django 技术实现自动化漏洞扫描系统开发

作者简介 ,徐师兄是一位拥有7年大厂经验的资深程序员,致力于Python技术领域的探索与实践,擅长毕业设计实战。他拥有超过12万的全网粉丝,是CSDN博客专家,也是掘金、华为云、阿里云和InfoQ等平台的优质作者。除了丰富的实…

EleutherAI/pythia-70m

EleutherAI/pythia-70m” 是由 EleutherAI 开发的一个小型开源语言模型,它是 Pythia Scaling Suite 系列中参数量最小的模型,拥有大约 7000 万个参数。这个模型主要旨在促进对语言模型可解释性的研究; Pythia Scaling Suite是为促进可解释性…

WinForm 美化秘籍:轻松实现 Panel 圆角虚线边框

文章目录 1、引言2、案例实现1、创建自定义 Panel 类2、定义圆角矩形3. 使用自定义 Panel4. 调整属性5、使用背景图片来实现5、拓展:使用 Panel 的 Paint重绘单独实现虚线边框效果 3、实现效果4、总结 1、引言 在 Winform 应用程序开发中,美化用户界面&…

Goland 安装与使用

GoLand安装 官方网址: JetBrains GoLand:不只是 Go IDE 1. 进入官网,点击下载: ​ 2. 如下图一步步安装 ​ ​ ​ ​ ​ 3. 如下图一步步安装

pdf有密码,如何实现pdf转换word?

PDF想要转换成其他格式,但是当我们将文件拖到PDF转换器进行转换的时候发现PDF文件带有密码怎么办?今天分享PDF有密码如何转换成word方法。 方法一、 PDF文件有两种密码,打开密码和限制编辑,如果是因为打开密码,建议使…

uniapp实现APP、小程序与webview页面间通讯

需求: 1、需要在Uniapp开发的APP或小程序页面嵌入一个H5网页,需要拿到H5给APP传递的数据。 2、并且这个H5是使用vuevant开发的。(其实跟使用uniapp开发H5一样) 实现步骤: 1、首先需要兼容多端和App端,因…