当前位置: 首页 > news >正文

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、中序遍历森林中(除第一棵树之外)其余树构成的森林。

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

在这里插入图片描述

相关文章:

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

一、树的存储结构 1)双亲表示法实现: 定义结构数组存放树的结点,每个结点含两个域: 数据域:存放结点本身信息。双亲域:指示本结点的双亲结点在数组中的位置。 特点:找双亲简单,找孩子难 C语…...

新浪微博大数据面试题及参考答案(数据开发和数据分析)

介绍一下你所掌握的计算机网络和操作系统相关知识 计算机网络:计算机网络是将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。我掌握了网络协议…...

OpenHarmony怎么修改DPI密度值?RK3566鸿蒙开发板演示

本文介绍在开源鸿蒙OpenHarmony系统下,修改DPI密度值的方法,触觉智能Purple Pi OH鸿蒙开发板演示,搭载了瑞芯微RK3566四核处理器,Laval鸿蒙社区推荐开发板,已适配全新开源鸿蒙OpenHarmony5.0 Release系统,适…...

SAP GUI Scripting - 如何判断组件是否存在

总体来说,SAP Scripting 与 BDC 类似,因为是屏幕录制,就可能碰到不同的情况,比如每个录入的数据不同,可能出现一个对话框,或者出现一个状态栏消息。这种任何有变化的情况,在 Scripting 中没有考…...

Go 计算Utf8字符串的长度 不要超过mysql字段的最大长度

背景: 我有一个mysql的字段,是utf8格式的,但有时候前端传的字符串会超长,为此我需要在后端接口,先判断是否超长,如果超长,则报错提示前端。 代码: // 计算utf8下,字符串…...

llamafactory报错:双卡4090GPU,训练qwen2.5:7B、14B时报错GPU显存不足(out of memory),轻松搞定~~~

实际问题场景: 使用llamafactory进行微调qwen2.5 7B和14B的大模型时,会出现out of memory的报错。尝试使用降低batch_size(原本是2,现在降到1)的方式,可以让qwen2.5:7B跑起来,但时不时会不稳定…...

全局webSocket 单个页面进行监听并移除单页面监听

之前全局封装的 webSocket 在某些特定的页面中使用会直接去调用 webSocket 的 onMessage 方法 已进入页面就会调,如果退出页面移除整个监听的话全局监听就会被移除 这是修改后的 全局封装 let token uni.getStorageSync(token) const HEARTBEAT_INTERVAL 1 *…...

JVM调优实践篇

理论篇 1多功能养鱼塘-JVM内存 大鱼塘O(可分配内存): JVM可以调度使用的总的内存数,这个数量受操作系统进程寻址范围、系统虚拟内存总数、系统物理内存总数、其他系统运行所占用的内存资源等因素的制约。 小池塘A&a…...

【JavaEE】Spring Web MVC

目录 一、Spring Web MVC简介 1.1 MVC简介1.2 Spring MVC1.3 RequestMapping注解1.3.1 使用1.3.2 RequestMapping的请求设置 1.3.2.1 方法11.3.2.2 方法2 二、Postman介绍 2.1 创建请求2.2 界面如下:2.3 传参介绍 一、Spring Web MVC简介 官方文档介绍&#xff…...

VSCode 插件开发实战(七):插件支持了哪些事件,以及如何利用和监听这些事件

前言 VSCode 作为现代开发者的首选编辑器之一,其核心优势在于其高度可扩展性。通过自定义插件,开发者可以根据自己的需求对编辑器进行功能扩展和优化。在这些插件开发过程中,事件处理和监听机制尤为重要,它们允许插件在特定事件发…...

指针详解之 多层嵌套的关系

1 例子之指向3个字符串的指针数组,易混淆! 1.1过程详解: char *str[3]{ "Hello,thisisasample!", "Hi,goodmorning.", "Helloworld" }; char s[80]; strcpy(s,str[0]); //也可写成strcpy(s,*st…...

Animated Drawings:让纸上的角色动起来

前言 今天介绍的这个工具非常的有意思:它可以让我们在纸上绘画的角色动起来。先一起来看看效果: 准备 首先,我们先准备一张绘画。可以在纸上进行绘制,也可以在电子设备上进行绘制。绘制内容不限,在这里为了方便演示&am…...

技术与教育的结合:高校听课评价系统的设计与实施

3.1系统可行性分析 需要使用大部分精力开发的高校听课评价系统为了充分降低开发风险,特意在开发之前进行可行性分析这个验证系统开发是否可行的步骤。本文就会从技术角度,经济角度,还有用户使用的程序的运行角度进行综合阐述。 3.1.1 技术可行…...

web移动端项目常用解决方案

移动端总会遇到一系列特定于移动设备的问题,分享下常见的移动端常见问题的处理方案。 1px边框问题 在高清屏幕下,1px的边框显示得比较粗。 .border-1px {position: relative; } .border-1px::after {position: absolute;content: ;width: 200%;height:…...

LabVIEW软件项目设计方案如何制定

制定LabVIEW软件项目设计方案需要综合考虑需求分析、架构设计、功能模块划分和时间预算等多个方面,确保项目开发过程高效、可控且最终满足目标要求。以下是一个详细的制定流程: ​ 1. 需求分析 目标定义:明确项目的目标,例如数据采…...

数据结构(Java)——链表

1.概念及结构 链表是一种 物理存储结构上非连续 存储结构,数据元素的 逻辑顺序 是通过链表中的 引用链接 次序实现的 。 2.分类 链表的结构非常多样,以下情况组合起来就有 8 种链表结构: (1)单向或者双向 (…...

变量与数据类型 - 整型、浮点型、字符型等

引言 在编程中,变量和数据类型是基础中的基础。理解它们如何工作以及如何正确使用它们对于编写高效且无误的代码至关重要。本文将详细介绍 C 中的几种基本数据类型:整型、浮点型、字符型等,并通过实例帮助读者更好地理解和掌握这些概念。 一…...

MacOS安装Xcode(非App Store)

文章目录 访问官网资源页面 访问官网资源页面 直接访问官网的历史版本下载资源页面地址:https://developer.apple.com/download/more/完成APP ID的登陆,直接找到需要的软件下载即可 解压后,安装将xcode.app移动到应用程序文件夹。...

运行Zr.Admin项目(后端)

1.下载Zr.Admin代码压缩包 https://codeload.github.com/izhaorui/Zr.Admin.NET/zip/refs/heads/main 2.打开项目 我这里装的是VS2022社区版 进入根目录,双击ZRAdmin.sln打开项目 3.安装.net7运行时 我当时下载的代码版本是.net7的 点击安装 点击安装&#xff0…...

Ubuntu24.04最新版本安装详细教程

Ubuntu 24.04 LTS发布说明 推荐的系统配置要求: 双核2 GHz处理器或更高 4 GB系统内存 25 GB磁盘存储空间 可访问的互联网 光驱或USB安装介质 Ubuntu 24.04官方下载网址:https://cn.ubuntu.com/download/desktop 04. Ubuntu 22.04(创建虚拟机方式一) 4…...

PyTorch实战:用门控卷积(GConv)和转置门控卷积(TrGConv)搞定音频降噪(附完整代码)

PyTorch实战:用门控卷积(GConv)和转置门控卷积(TrGConv)构建高效音频降噪模型 音频降噪一直是信号处理领域的核心挑战之一。想象一下,你正在录制一段重要的语音备忘录,背景中却充斥着风扇的嗡嗡…...

Java服务在Istio中Metrics丢失、Tracing断链?OpenTelemetry + Istio Telemetry V2精准对齐配置

第一章:Java服务在Istio中Metrics丢失与Tracing断链的根因剖析当Java应用以Sidecar模式接入Istio时,常出现Prometheus采集不到服务间HTTP指标(如istio_requests_total)、Jaeger/Zipkin中Span链路在Java服务入口处中断等现象。这些…...

Alpamayo-R1-10B保姆级教程:Linux服务器远程访问7860端口配置

Alpamayo-R1-10B保姆级教程:Linux服务器远程访问7860端口配置 1. 引言:为什么需要远程访问? 想象一下这个场景:你在本地电脑上部署了强大的Alpamayo-R1-10B自动驾驶模型,但每次想测试都得跑到服务器机房,…...

Python程序设计期末考试高频大题精讲:二维列表数据处理实战与深度解析

Python程序设计期末考试高频大题精讲:二维列表数据处理实战与深度解析 摘要:本文以高校计算机科学与技术专业《Python程序设计》期末考试中一道典型大题——“统计学生捐款次数”为切入点,系统讲解二维列表(嵌套列表)的…...

OpenClaw二次开发指南:Qwen3.5-9B模型适配与API扩展

OpenClaw二次开发指南:Qwen3.5-9B模型适配与API扩展 1. 为什么需要二次开发OpenClaw? 去年冬天,当我第一次尝试用OpenClaw对接本地部署的Qwen3.5-9B模型时,遇到了几个棘手问题:模型返回的JSON格式与框架预期不符、长…...

杭州污水提升泵靠谱厂家

在杭州及周边地区进行地下室改造、商业空间建设或解决特殊排污需求时,选择一家技术可靠、服务专业的污水提升泵厂家至关重要。在众多厂家中,杭州富阳赛特仪表阀门有限公司(赛斯瑞特) 凭借其深厚的技术积淀、过硬的产品品质和完善的…...

Java程序员的云原生时代生存指南:面向软件测试从业者的专业视角

在技术浪潮的冲击下,云原生已从概念演进为产业标准。对于广大Java程序员而言,这既是挑战也是机遇。传统的技术栈和开发模式正在经历深刻变革,而软件测试作为保障质量的关键环节,其理念与实践也随之迭代。 一、 挑战审视&#xff…...

【Java外部函数性能优化黄金法则】:20年JVM专家亲授JNI/FFM调优的7大致命误区与3步极速修复方案

第一章:Java外部函数优化的演进脉络与性能本质Java平台对外部函数调用(Foreign Function & Memory API,即JEP 454/464/471/472)的演进,标志着JVM从“纯Java世界”迈向系统级互操作的新纪元。其性能本质并非单纯降低…...

实时信号处理中的滤波器选型实战指南:从需求分析到性能优化

实时信号处理中的滤波器选型实战指南:从需求分析到性能优化 【免费下载链接】gnuradio GNU Radio – the Free and Open Software Radio Ecosystem 项目地址: https://gitcode.com/gh_mirrors/gn/gnuradio 一、需求分析:明确滤波器设计目标 在开…...

指挥OpenClaw抓取数据折腾了一夜,我终于想到了邪修玩法

这段时间玩小龙虾玩得真上头,突然想起之前一直想要统计公众号的数据。 这工作交给小龙虾妥妥能胜任啊!但是吧……实际上执行出来的结果却不是这样的。 因为小白本地使用的是OpenClawAtomgit的方案,Atomgit主打一个不费一分钱,免…...