【数据结构】树与森林

目录

树的存储方法

双亲表示法

孩子表示法

孩子兄弟表示法

树、森林与二叉树的转换

树转换成二叉树

森林转换成二叉树

二叉树转换成森林

树与森林的遍历

树的遍历

森林的遍历


树的存储方法

双亲表示法

这种存储结构采用一组连续空间来存储每个结点,同时在每个结点中增设一个伪指针,指示其双亲结点在数组中的位置,根结点下标为0,其伪指针域为-1。

孩子表示法


孩子表示法是将每个结点的孩子结点视为一个线性表,且以单链表作为存储结构,则n个结点就有n个孩子链表(叶结点的孩子链表为空表)。而n个头指针又组成一个线性表,为便于查找,可采用顺序存储结构。

孩子兄弟表示法

孩子兄弟表示法又称二叉树表示法,即以二叉链表作为树的存储结构。孩子兄弟表示法使每个结点包括三部分内容:结点值、指向结点第一个孩子结点的指针,以及指向结点下一个兄弟结点的指针,其中左指针指向第一个孩子,右指针指向第一个兄弟。

孩子兄弟表示法比较灵活,其最大的优点是可以方便地实现树转换为二叉树的操作,易于查找结点的孩子等,但缺点是从当前结点查找其双亲结点比较麻烦。若为每个结点增设一个parent域指向其父结点,则查找结点的父结点也很方便。

孩子兄弟表示法代码如下:

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

树、森林与二叉树的转换

树转换成二叉树

树转换为二叉树的规则是:每个节点的左指针指向它的第一个孩子,右指针指向它在树中的相邻右兄弟。这种规则也被称为“左孩子右兄弟”表示法。由于根节点在树中没有兄弟,因此树转换得到的二叉树的根节点没有右子树。

将树转换为二叉树的画法可以按照以下步骤进行:

1. 在兄弟节点之间加连线:对于树中的每个节点,将其所有子节点(即兄弟节点)之间用线连接起来。
2. 保留第一个孩子的连线,删除其他孩子的连线:对于每个节点,只保留它与第一个孩子的连线,而删除与其他子节点的连线。
3.顺时针旋转 45°:以树的根节点为轴心,将整个结构顺时针旋转 45°,使得转换后的二叉树符合“左孩子右兄弟”的规则。

示例如下:

森林转换成二叉树

将森林转换为二叉树的规则与树转换为二叉树类似,具体步骤如下:

1. 先将森林中的每棵树分别转换为二叉树,转换规则遵循“左孩子右兄弟”原则,即每个节点的左指针指向其第一个孩子,右指针指向其相邻的右兄弟。
2. 连接各二叉树:由于每棵树转换为二叉树后,其右子树必定为空,因此可以将森林中第二棵树的根节点视为第一棵树根节点的右兄弟,即将第二棵树对应的二叉树作为第一棵二叉树根的右子树;同理,将第三棵树对应的二叉树作为第二棵二叉树根的右子树,依次类推,最终将整个森林连接成一棵二叉树。

二叉树转换成森林

二叉树转换为森林的规则如下:

1. 确定第一棵树:如果二叉树非空,那么二叉树的根节点及其左子树对应森林中的第一棵树。因此,需要将根节点的右链断开。
2. 递归处理剩余部分:断开右链后,二叉树根的右子树可以看作是由森林中除第一棵树之外的其余树转换而来的二叉树。对这个右子树重复上述操作,即继续断开右链,提取下一颗树,直到最后只剩下一棵没有右子树的二叉树为止。
3.转换为树:将每棵提取出的二叉树依次转换为树。最终,这些树组合起来就是原森林。

二叉树转换为树或森林的过程是唯一的。

树与森林的遍历

树的遍历

树的遍历是指按照某种顺序访问树中的每个节点,并且每个节点只被访问一次。主要的遍历方式有两种:

先根遍历

  1. 如果树非空,先访问根节点。
  2. 然后依次遍历根节点的每棵子树,在遍历子树时仍然按照“先根后子树”的规则进行。
  3. 先根遍历的序列与这棵树转换为二叉树后的先序遍历序列相同。

后根遍历

  1. 如果树非空,先依次遍历根节点的每棵子树,在遍历子树时仍然按照“先子树后根”的规则进行。
  2. 遍历完所有子树后,再访问根节点。
  3. 后根遍历的序列与这棵树转换为二叉树后的中序遍历序列相同。

森林的遍历

森林的遍历方法基于森林和树的递归定义,主要有两种遍历方式:

先序遍历森林

  1. 如果森林非空,先访问森林中第一棵树的根节点。
  2. 然后先序遍历第一棵树中根节点的子树森林(即第一棵树的子树部分)。
  3. 最后,先序遍历除去第一棵树之后剩余的树构成的森林。

中序遍历森林

  1. 如果森林非空,先中序遍历森林中第一棵树的根节点的子树森林(即第一棵树的子树部分)。
  2. 然后访问第一棵树的根节点。
  3. 最后,中序遍历除去第一棵树之后剩余的树构成的森林。

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

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

相关文章

html5基于Canvas的动态时钟实现详解

基于Canvas的动态时钟实现详解 这里写目录标题 基于Canvas的动态时钟实现详解项目介绍技术栈项目架构HTML结构核心样式设计 核心功能实现1. 时钟表盘绘制2. 时钟指针动画3. 主题切换实现4. 时间格式切换 技术要点总结项目亮点总结参考资料 项目介绍 在这篇文章中,我…

Deepseek API+Python 测试用例一键生成与导出 V1.0.3

** 功能详解** 随着软件测试复杂度的不断提升,测试工程师需要更高效的方法来设计高覆盖率的测试用例。Deepseek API+Python 测试用例生成工具在 V1.0.3 版本中,新增了多个功能点,优化了提示词模板,并增强了对文档和接口测试用例的支持,极大提升了测试用例设计的智能化和易…

react如何引用(按需加载)百度地图,并结合and组件化封装

1.技术选项: vitereactantdesign load-script 2.实现思路: 1.按需加载如何实现? 要实现按需加载就不能直接在项目的入口文件这种地方去通过script标签引入,这里使用load-script封装了一个加载百度地图的Bmap.js方法,实现动态的插入script脚本。 根…

LeetCode 第31~33题

目录 LeetCode 第31题:下一个排列 LeetCode 第32题:最长有效括号 LeetCode 第33题:搜索旋转排序数组 LeetCode 第31题:下一个排列 题目描述 整数数组的一个排列就是将所有成员以序列或线性顺序排列。例如arr[1,2,3],以…

虚拟现实--->unity学习

前言:这学期劳动课选了虚拟现实,其中老师算挺认真的,当然对一些不感兴趣的同学来说是一种折磨,我对这个unity的学习以及后续的虚幻引擎刚开始连基础的概念都没有,后面渐渐也是滋生了一些兴趣,用这篇博客记录…

在Trae中设置Python解释器版本

Python 是一种广泛使用的高级编程语言,因其简洁易读的语法和强大的功能而备受欢迎。随着 Python 的不断发展,多个版本相继发布,每个版本都带来了新特性和改进。然而,这也带来了一些问题,比如不同的工程,需要…

鸿蒙原生开发之状态管理V2

一、ArkTS状态变量的定义: State:状态,指驱动UI更新的数据。用户通过触发组件的事件方法,改变状态数据。状态数据的改变,引起UI的重新渲染。 在鸿蒙原生开发中,使用ArkTS开发UI的时候,我们可以…

nginx配置跳转设置Host有误导致报404问题

我们有个项目,前端调用了第三方接口。为了避免跨域,所以使用nginx进行转发。一直正常工作,相安无事。近日第三方调整了安全策略,http转换成https,原本使用ip,现在也改成使用域名,所以nginx这里我…

深度学习 Deep Learning 第12章 深度学习的主流应用

深度学习 Deep Learning 第12章 深度学习的主流应用 内容概要 本周深入探讨了深度学习在多个领域的应用,包括计算机视觉、语音识别、自然语言处理以及其他领域如推荐系统和知识表示。本章强调了硬件和软件基础设施的重要性,特别是GPU在加速神经网络训练…

【Qt】三种操作sqlite3的方式及其三种多表连接

一、sqlite3与MySQL数据库区别: 1. 数据库类型 SQLite3:是嵌入式数据库,它将整个数据库存储在单个文件中,不需要独立的服务器进程。这意味着它可以很方便地集成到各种应用程序中,如移动应用、桌面应用等。MySQL&…

mysqlworkbench导入.sql文件

1、MySQL Workbench 新建数据库 或者 在左侧导航栏的 ​Schemas 区域右键选择 ​Create Schema...输入数据库名称(例如 mydatabase),点击 ​Apply确认创建,点击 ​Finish 2、选择目标数据库 在左侧导航栏的 ​Schemas 列表中&a…

《Spring Cloud Eureka 高可用集群实战:从零构建高可靠性的微服务注册中心》

从零构建高可用 Eureka 集群 | Spring Cloud 微服务架构深度实践指南 本文核心内容基于《Spring Cloud 微服务架构开发》第1版整理,结合生产级实践经验优化 实验环境:IntelliJ IDEA 2024 | JDK 1.8| Spring Boot 2.1.7.RELEASE | Spring Cloud Greenwich…

实变函数:集合与子集合一例(20250329)

题目 设 r , s , t r, s, t r,s,t 是三个互不相同的数,且 A { r , s , t } A \{r, s, t\} A{r,s,t}, B { r 2 , s 2 , t 2 } B \{r^2, s^2, t^2\} B{r2,s2,t2}, C { r s , s t , r t } C \{rs, st, rt\} C{rs,st,rt} 若 A B C A B C ABC 则 { r , s…

Redis设计与实现-哨兵

哨兵模式 1、启动并初始化sentinel1.1 初始化服务器1.2 使用Sentinel代码1.3 初始化sentinel状态1.4 初始化sentinel状态的master属性1.5 创建连向主服务器的网络连接 2、获取主服务器信息3、获取从服务器的信息4、向主从服务器发送信息5、接受主从服务器的频道信息6、检测主观…

蓝桥杯省模拟赛 字符串拼接

问题描述 给定四个字符串 a,b,c,d,请将这四个字符串按照任意顺序依次连接拼成一个字符串。 请问拼成的字符串字典序最小是多少? 输入格式 输入四行,每行包含一个字符串。 输出格式 输出一行包含一个字符串,表示答案。 样例…

【大前端系列20】JavaScript核心:项目实战从零构建任务管理系统

JavaScript核心:项目实战从零构建任务管理系统 系列: 「全栈进化:大前端开发完全指南」系列第20篇 核心: 将JavaScript异步编程、事件循环等核心知识应用于实际项目开发 📌 引言 在前面的文章中,我们深入探讨了JavaScript中的异步…

STM32单片机的桌面宠物机器人(基于HAL库)

效果 基于STM32单片机的桌面宠物机器人 概要 语音模块:ASR PRO,通过天问block软件烧录语音指令 主控芯片:STM32F103C8T6 使用HAL库 屏幕:0.96寸OLED屏,用来显示表情 4个舵机,用来当作四只腿 底部一个面…

计算机视觉初步(环境搭建)

1.anaconda 建议安装在D盘,官网正常安装即可,一般可以安装windows版本 安装成功后,可以在电脑应用里找到: 2.创建虚拟环境 打开anaconda prompt, 可以用conda env list 查看现有的环境,一般打开默认bas…

SQL Server数据库引擎服务启动失败:端口冲突

问题现象: SQL Server 2022 安装完成后,数据库引擎服务无法启动,日志报错 “TCP 端口 1433 已被占用”(ERROR_LOG_SYS_TCP_PORT)。 快速诊断 检测端口占用: # 查看 1433 端口占用情况(需管理员权…

全局思维与系统思考

最近接到一些需求,1号位希望每个层级的领导者有眼界,胸怀,格局,全局观,这些听起来似乎很抽象,然而它们是每个人、每个团队成长与成功的核心竞争力。那么,如何才能提升这些能力?就像我…