408数据结构-树与森林 自学知识点整理

前置知识:树的基本概念与性质


树的存储结构

树既可以采用顺序存储结构,又可采用链式存储结构。但无论采取哪种方式,都要求能够唯一地反映树中各结点之间的逻辑关系。

1. 双亲表示法

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

#define MAX_TREE_SIZE 100
typedef struct ElemType {
	int value;
}ElemType;//预处理

typedef struct {
	ElemType data;
	int parent;//双亲位置域
}PTNode;
typedef struct {//树的类型定义
	PTNode nodes[MAX_TREE_SIZE];//双亲表示
	int n;//结点数
}PTree;

双亲表示法利用了除根结点以外每个结点只有唯一双亲的性质,优点是可以很快地得到每个结点的双亲结点,但缺点也很明显,求结点的孩子时需要遍历整个结构。
使用双亲表示法存储树时,删除结点共有两个方法:

  • 一是直接把需要删除的结点 p a r e n t parent parent值置 − 1 -1 1,表示当前结点为空(根结点默认存放在 n o d e s [ 0 ] 的位置 nodes[0]的位置 nodes[0]的位置,且 p a r e n t parent parent值也为 − 1 -1 1,需要特别判断)。但是这种方法在遍历找孩子时,会使得遍历过程要经过一个或多个空结点,徒增时间复杂度。
  • 二是把需要删除的结点和数组末尾元素交换,然后结点数n--。这种方法要优于方法一。

2. 孩子表示法

孩子表示法是将每个结点的孩子视为一个线性表,且以单链表作为数据结构,这样 n n n个结点就有 n n n个孩子链表(叶结点的孩子链表视为空表)。

struct CTNode {//单链表(B站弹幕说是邻接表)
	int child;//孩子节点在数组中的位置
	struct CTNode* next;//下一个孩子
};
typedef struct {
	ElemType data;
	struct CTNode* firstChild;//第一个孩子
}CTBox;
typedef struct {
	CTBox nodes[MAX_TREE_SIZE];//孩子表示法
	int n, r;//结点数和根的位置
}CTree;

与双亲表示法相反,孩子表示法寻找结点孩子的操作非常方便,但是寻找双亲的操作则需要遍历 n n n个结点中孩子链表指针域所指向的 n n n个孩子链表。同样的,可以顺着这个思路思考,如何实现孩子表示法存储的树的增删查改等基本操作。

3.孩子兄弟表示法⭐

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

typedef struct CSNode {//孩子兄弟表示法
	ElemType data;//数据域
	struct CSNode* firstchild, * nextsibling;//第一个孩子和右兄弟指针
}CSNode, * CSTree;

使用这种方法最大的优点就是可以实现将树转换为二叉树的操作,优缺点与二叉树的链式存储结构相同,这里不再展开。

树、森林与二叉树的相互转换

从物理结构上看,树的孩子兄弟表示法和二叉树的二叉链表表示法是相同的。因此可以用同一存储结构的不同解释将一棵树转换为二叉树。

1 ) 1) 1)树转换为二叉树

树转换为二叉树的规则:每个结点的左指针指向它的第一个孩子,右指针指向它在树中的相邻右兄弟,这个规则也称“左孩子右兄弟”。由于根结点没有兄弟,因此树转换得到的二叉树没有右子树,如图所示。 (图片来自王道考研408数据结构2025)
图片来自王道考研408数据结构2025
树转换为二叉树的画法:
①在兄弟结点之间加一条线;
②对每个结点,只保留它与第一个孩子的连线,与其他孩子的全部抹掉;
③以树根为轴心,顺时针旋转45°。
二叉树转换为树逆着来就行。

2 ) 2) 2)森林转换为二叉树

森林转换为二叉树的规则与树类似,只需要把每一棵树的根结点都看成兄弟,依次连在第一棵树根结点的右子树上即可。
森林转换为二叉树的画法:
①将森林中的每棵树转换成相应的二叉树;
②每棵树的根也可视为兄弟关系,在每棵树的根之间加一根连线;
③以第一棵树的根为轴心,顺时针旋转45°。
二叉树转换为森林同样逆着来就行,这里就不再展开。


树和森林的遍历

前置知识:二叉树的遍历

1. 树的遍历

树的遍历是指用某种方式访问树中的每个结点。主要有两种方法:

1 ) 1) 1)先根遍历。若树非空,则按如下规则遍历:
  • 先访问根结点。
  • 再依次遍历根结点的每棵子树,遍历子树时仍遵循先根后子树的规则。
void Visit(CSNode* T) {
	cout << T->data.value << " ";
	return;
}

void PreOrder(CSTree T) {//先根遍历(使用孩子兄弟表示法)
	if (T != NULL) {
		Visit(T);//访问根结点
		CSTree C = T->firstchild;//C记录当前树根结点的第一个孩子
		do {//首先对以C为根的子树进行先根遍历
			PreOrder(C);
			C = C->nextsibling;//再依次对C的右兄弟为根的子树进行先根遍历
		} while (C != NULL);//当C还有其他右兄弟时循环继续
	}
	return;
}

其遍历序列与这棵树对应的二叉树的先序序列相同。

2 ) 2) 2)后根遍历。若树非空,则按如下规则遍历:
  • 先依次遍历根结点的每棵子树,遍历子树是仍遵循先子树后根的规则。
  • 再访问根结点。
void PostOrder(CSTree T) {//后根遍历
	if (T != NULL) {
		CSTree C = T->firstchild;
		do {
			PostOrder(C);//对以C为根的子树后根遍历
			C = C->nextsibling;//依次访问C的右兄弟结点
		} while (C != NULL);
		Visit(T);//最后访问根结点
	}
	return;
}

其遍历序列与这棵树对应二叉树的中序序列相同。
例如,前文中图 5.23 5.23 5.23中的树,先根遍历序列为 A B E F C D G ABEFCDG ABEFCDG,后根遍历序列为 E F B C G D A EFBCGDA EFBCGDA

3)层次遍历

基本思想与二叉树的层次遍历相同。首先构造辅助队列;根结点入队;队头元素出队,访问当前结点,再将该结点的所有孩子结点入队;依次类推,直到队列为空。

2. 森林的遍历

由于森林和树相互递归的定义,可以得到森林的两种遍历方法:

1 ) 1) 1)先序遍历森林。若森林非空,则按如下规则遍历:
  • 先访问森林中第一棵树的根结点。
  • 先序遍历第一棵树中根结点的子树森林。
  • 先序遍历除去第一棵树之后剩余的树构成的森林。

其实就是按顺序对森林里每棵树依次进行先根遍历,然后把遍历序列按顺序连起来;或者把森林转换成二叉树再进行先序遍历。

2 ) 2) 2)中序遍历森林。若森林非空,则按如下规则遍历:
  • 中序遍历第一棵树中根结点的子树森林。
  • 访问森林中第一棵树的根结点。
  • 中序遍历除去第一棵树之后剩余的树构成的森林。

其实就是按顺序对森林里每棵树依次进行后根遍历,然后把遍历序列按顺序连起来;或者把森林转换成二叉树再进行中序遍历。


对树的遍历,层次遍历又被称为广度优先遍历,先根、后跟又被称为深度优先遍历。
408考研初试中,需掌握手推树与森林的遍历序列的能力,如果运气太差碰到代码实现题,可以先转换成二叉树,再用熟悉的方法处理问题。
以上。

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

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

相关文章

柯桥西语培训之在西班牙旅游点菜哪些坑不能踩?

Por muy bien que se coma en Espaa —que es mucho— hay una cosa innegable: lo que pasa en la cocina se queda en la cocina. No todos los alimentos son igualmente seguros o sabrosos cuando se encuentran fuera de la comodidad de nuestra propia casa. Ya sea po…

Linux网络服务的存储,FTP服务和NFS共享

目录 一.存储 1.存储类型 2.应用场景 二.FTP服务 1.FTP工作原理介绍 2.FTP协议的两种模式 3.用户类型 4.匿名用户案例 三.NFS 1.NFS简介 2.NFS服务主要进程 3.NFS特点 4.NFS共享配置文件格式 5.NFS工具 5.1 exportfs 5.2 showmount 5.3 mount.nfs 6.创建文…

Go 语言基础(一)【基本用法】

前言 最近心情格外不舒畅&#xff0c;不仅仅是对前途的迷茫&#xff0c;这种迷茫倒是我自己的问题还好&#xff0c;关键它是我们这种普通吗喽抗衡不了的。 那就换个脑子&#xff0c;学点新东西吧&#xff0c;比如 Go&#xff1f; 1、Go 语言入门 介绍就没必要多说了&#xff0…

网络安全(6) 模拟实验 Metasploit 控制并获取Windows 登录HASH、LM Hash和NTLM Hash密文解析

窃取WINDOWS账号密码 系统环境&#xff1a;主机&#xff08;Windows系统 IP&#xff1a;192.168.126.129)&#xff0c;虚拟机&#xff08;KALI系统 IP&#xff1a;192.168.126.3&#xff09;&#xff0c;两者需要能通过本地网络互通互连。 攻击工具&#xff1a;Metasploit是一…

自动化工具

一、介绍一些自动化的工具 puppet和chef用的是Ruby语言http协议&#xff0c;淘汰 saltstack Python语言 c/s ssh协议&#xff0c;5% ansible 无cilent ssh协议 用Python开发 95% 二、ansible简介 2.1 ansible自动化运维工具特点 Ansible 与 Saltstack 均是基于…

HNU-人工智能-实验2-简单CSP问题

人工智能-实验2 计科210x 甘晴void 一、实验目的 求解约束满足问题 使用回溯搜索算法求解八皇后问题 二、实验平台 课程实训平台https://www.educoder.net/paths/369 三、实验内容 3.0 题目要求 回溯搜索算法 搜索与回溯是计算机解题中常用的算法&#xff0c;很多问…

【STM32嵌入式系统设计与开发】——18StaticNixite(静态数码管应用)

这里写目录标题 STM32资料包&#xff1a; 百度网盘下载链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1mWx9Asaipk-2z9HY17wYXQ?pwd8888 提取码&#xff1a;88881、函数编辑&#xff08;1&#xff09;主函数编辑&#xff08;2&#xff09;主函数头文件函数&#x…

LangChain-RAG学习之 文档加载器

目录 一、实现原理 二、文档加载器的选择 (一).PDF 加载本地文件 可能需要的环境配置 (二).CSV 1、使用每个文档一行的 CSV 数据加载 CSVLoader 2、自定义 csv 解析和加载 &#xff08;csv_args 3、指定用于 标识文档来源的 列&#xff08;source_column (三)、文件目…

某了么数据获取脚本

某了么数据获取脚本 这段代码定义了一个名为 ElemeH5 的类&#xff0c;继承自 Base 类&#xff0c;用于处理与饿了么平台的API交互。该类包括了多种方法来进行网络请求、数据处理和API接口的动态生成。以下是对主要组成部分的详细解析&#xff1a; 类属性定义&#xff1a; fun…

2023陇剑杯-流量分析篇-wp

1.ez_web Q1:服务器自带的后门文件是什么&#xff1f; 常用http过滤命令&#xff1a;http.request.full_urihttp.request.methodPOST 查看第一个POST请求&#xff0c;发现关键点file_put_contents&#xff08;备注&#xff1a;file_put_contents内置函数&#xff0c;用于将字…

2×24.5W、内置 DSP、低失真、高信噪比、I2S 输入 D 类音频功率放大器,完美替换TPA5805,晶豪,致盛,

ANT3825 是一款高集成度、高效率的双通道数字 输入功放。供电电压范围在 5V&#xff5e;18V&#xff0c;数字接口 电源支持 3.3V 或 1.8V。双通道 BTL 模式下输出 功率可以到 224.5W(4Ω&#xff0c;16V&#xff0c;THDN1%)&#xff0c; 单通道 PBTL 模式下可以输出 37W&#x…

Rust里的Fn/FnMut/FnOnce和闭包匿名函数关系

闭包&#xff08;英语&#xff1a;Closure&#xff09;&#xff0c;又称词法闭包&#xff08;Lexical Closure&#xff09;或函数闭包&#xff08;function closures&#xff09;&#xff0c;是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在&#xff0c;即使…

武汉星起航:策略升级,亚马逊平台销售额持续增长显实力

武汉星起航电子商务有限公司&#xff0c;一家致力于跨境电商领域的企业&#xff0c;于2023年10月30日在上海股权托管交易中心成功挂牌展示&#xff0c;这一里程碑事件标志着公司正式踏入资本市场&#xff0c;开启了新的发展篇章。公司董事长张振邦在接受【第一财经】采访时表示…

Java_从入门到JavaEE_09

一、构造方法/构造器 含义&#xff1a;和new一起是创建对象的功能 特点&#xff1a; 与类名相同的方法没有返回项 注意&#xff1a; 当类中没有写构造方法时&#xff0c;系统会默认添加无参构造&#xff08;无参数的构造方法&#xff09;构造方法可以重载的 有参构造好处&…

开源15T tokens!HuggingFace放出规模最大、质量最高预训练数据集 | 最新快讯

新智元报道 编辑&#xff1a;LRS FineWeb 是一个高质量的预训练数据集&#xff0c;包含 15T 个 tokens&#xff0c;主要包含英语文本&#xff1b;消融实验证明了 FineWeb 数据集的质量要高于其他开源数据集&#xff1b;数据清洗脚本也已开源。 Meta 最近开源的 Llama 3 模型再次…

vulnhub靶场之FunBox-2

一.环境搭建 1.靶场描述 Boot2Root ! This can be a real life scenario if rockies becomes admins. Easy going in round about 15 mins. Bit more, if you are find and stuck in the rabbit-hole first. This VM is created/tested with Virtualbox. Maybe it works with…

C#编程模式之外观模式

创作背景&#xff1a;给位伙伴&#xff0c;五一小长假结束&#xff0c;我们继续对C#编程之路进行探索。本文将继续编程模式的研究&#xff0c;主要介绍外观模式。外观模式也称为门面模式&#xff0c;是一种结构型设计模式&#xff0c;它的目的是为子系统中的一组接口提供一个统…

【隧道篇 / WAN优化】(7.4) ❀ 01. 启动WAN优化 ❀ FortiGate 防火墙

【简介】几乎所有的人都知道&#xff0c;防火墙自带的硬盘是用来保存日志&#xff0c;以方便在出现问题时能找到原因。但是很少的人知道&#xff0c;防火墙自带的硬盘其实还有另一个功能&#xff0c;那就是用于WAN优化。 防火墙自带的硬盘 在FortiGate防火墙A、B、C、D系列&…

oracle 8i系统检查

oracle 8i系统检查 set echo on spool d:\bk\1.txt select sysdate from dual; --版本信息 select * from v$version; --安装的产品 col PARAMETER for a50; col value for a10; select * from v$option order by 2; --用户信息 set linesize 100 set pagesize 100 COL USE…

景源畅信:抖音运营做什么工作内容?

在如今这个信息爆炸的时代&#xff0c;抖音已经成为了人们生活中不可或缺的一部分。无论是消磨时间、获取信息还是展示自我&#xff0c;抖音都扮演着重要的角色。那么&#xff0c;作为抖音运营&#xff0c;他们需要做些什么呢? 一、内容策划与制作 抖音运营的首要任务就是内容…
最新文章