数据结构——树和森林

news2025/1/11 8:39:57

目录

树的存储结构

1、双亲表示法

2、孩子链表

 3、孩子兄弟表示法

树与二叉树的转换

将树转换为二叉树 

 将二叉树转换为树

森林与二叉树的转化

森林转换成二叉树 

 二叉树转换为森林

树和森林的遍历

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

 2、森林的遍历


树的存储结构

1、双亲表示法

实现:定义结构数组

存放树的结点,每个结点含两个域:

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

写成树的形式如下:

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

 C语言的类型描述:

结点结构: 

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语言的类型描述:

孩子结点结构:

typedef struct CTNode {
	int child; //下一个孩子的下标
	struct CTNode* next;//下一个孩子的地址
}*ChildPtr;

双亲结点结构:

typedef struct {
	TElemType data;   //根结点数据
	ChildPtr firstchild; //第一个孩子的下标
}CTBox;

树结构:

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

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

 怎么解决这个问题呢?我们可以通过增加结点的信息,将双亲的下标添加到每个结点的结构体中,这叫做带双亲的孩子链表

 3、孩子兄弟表示法

孩子兄弟表示法也叫二叉树表示法、二叉链表表示法。

实现:用二叉链表(三部分:数据域,两个指针域:一个指向左孩子,一个指向右孩子)作树的存储结构,链表中每个结点的两个指针域分别指向其第一个孩子结点下一个兄弟结点

 C语言的算法描述:

typedef struct CSNode {
	ElemType data; //存储结点的数据
	struct CSNode* firstchild, * nextsibling;//一个指向第一个孩子,一个指向下一个兄弟
}CSNode,*CSTree;

图解描述:

树与二叉树的转换

  • 将树转换为二叉树进行处理,利用二叉树的算法来实现对树的操作。
  • ‘由于树和二叉树都可以用二叉链表作存储结构,则以二又链表作媒介可以导出树与二又树之间的一个对应关系。

树用二叉链表(一个指针域指向它的第一个孩子,一个指向它的第一个兄弟)的形式存储如下:

 与其具有同样二叉链表结构的二叉树如下:

 给定一棵树,可以找到唯一的一棵二叉树与之对应。

将树转换为二叉树 

1)加线:在兄弟之间加一条连线 

2)抹线:对每个结点,除了其左孩子外,去除其与其余孩子之间的关系

3)旋转:以树的所有根结点为轴心,将整树顺时针转45°

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

 例:将树转换为二叉树

 将二叉树转换为树

1)加线:若p结点是双亲结点的左孩子,则将p的右孩子,右孩子的右孩子..…沿分支找到的所有右孩子,都与p的双亲用线连起来

2)抹线:抹掉原二又树中双亲与右孩子之间的连线

3)调整:将结点按层次排列,形成树结构

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

  例:将二叉树转换为树

森林与二叉树的转化

森林转换成二叉树 

1)将各棵树分别转换成二叉树

2)将每棵树的根结点用线相连

3)以第一棵树根结点为二又树的根,再以根结点为轴心,顺时针旋转构成二叉树型结构 

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

(1)兄弟相连留长子 

 

(2)根结点相连

 

 (3)旋转45°

 

 二叉树转换为森林

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

2)还原:将孤立的二又树还原成树 

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

例:二叉树转换为森林

 (1)去掉右孩线,成为孤立的二叉树

(2)二叉树还原

 

树和森林的遍历

1、 树的遍历(三种方式)
  • 先根(次序)遍历:若树不空,则先访问根结点,然后依次先根遍历各棵子树。
  • 后根(次序)遍历:若树不空,则先依次后根遍历各棵子树,然后访问根结点。
  • 按层次遍历:若树不空,则自上而下自左至右访问树中每个结点。

 例:

 2、森林的遍历

将森林看作由三部分构成:

1、森林中第一棵树的根结点;

2.森林中第一棵树的子树森林;

3.森林中其它树构成的森林。

(1)先序遍历:

若森林不空,则
1、访问森林中第一棵树的根结点;

2.先序遍历森林中第一棵树的子树森林;

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

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

 (2)中序遍历:

若森林不空,则
中序遍历森林中第一棵树的子树森林;

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

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

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

例:森林的遍历

 

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

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

相关文章

DVWA之File Inclusion(文件包含)

DVWA之File Inclusion(文件包含) 1、定义:服务器通过php的特性(函数的特性)去包含任意文件时,由于对包含的文件来源没有过滤或过滤不严,从而可去包含一个恶意的文件。文件包含包括:…

【从零开始的LeetCode-算法】3200. 三角形的最大高度

给你两个整数 red 和 blue,分别表示红色球和蓝色球的数量。你需要使用这些球来组成一个三角形,满足第 1 行有 1 个球,第 2 行有 2 个球,第 3 行有 3 个球,依此类推。 每一行的球必须是 相同 颜色,且相邻行…

AdaTAD(CVPR 2024)视频动作检测方法详解

前言 论文:End-to-End Temporal Action Detection with 1B Parameters Across 1000 Frames 代码:AdaTAD 从论文标题可以看出,AdaTAD 可以在 1B 参数且输入视频在 1000 帧的情况下实现端到端的训练,核心创新点是引入 Temporal-Inf…

STM32传感器模块编程实践(六) 1.8寸液晶屏TFT LCD彩屏简介及驱动源码

文章目录 一.概要二.TFT彩屏主要参数三.TFT彩屏参考原理图四.TFT彩屏模块接线说明五.模块SPI通讯协议介绍六.TFT彩屏模块显示1.显示英文字符串2.显示数字3.显示中文 七.TFT彩屏实现图片显示八.STM32单片机1.8寸 TFT LCD显示实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 九…

【C++】——list 容器的解析与极致实现

人的一切痛苦,本质上都是对自己的无能的愤怒。 —— 王小波 目录 1、list 介绍 2、list的使用 2.1 list 的构造 2.2 iterator 的使用 2.3 list 的修改 2.4一些特殊接口 2.5 迭代器失效问题 3、实现list 3.1底层结构 结点类 list类 迭代器类 3.2功能接…

VLOG视频制作解决方案,开发者可自行定制包装模板

无论是旅行见闻、美食探店,还是日常琐事、创意挑战,每一个镜头背后都蕴含着创作者无限的热情和创意。然而,面对纷繁复杂的视频编辑工具,美摄科技凭借其前沿的视频制作技术和创新的解决方案,为每一位视频创作者提供了开…

服务端负载均衡和客户端负载

负载均衡分为服务端负载均衡和客户端负载均衡,图解: 客户端的负载均衡还需要从注册中心获取集群部署的服务地址,其中客户的负载均衡器定时读取注册中心的IP和端口,然后缓存起来,这样以后可以先判断缓存IP和端口是否可用…

矩阵基础知识

矩阵定义 矩阵的定义 1.矩阵是由一组数按照矩形排列而成的数表。矩阵通常用大写字母表示,例如 AA、BB 等。矩阵中的每个数称为矩阵的元素或元。 一个 mn的矩阵 AA 可以表示为: 其中 aij表示矩阵 A中第i行第j列的元素。 矩阵的维度 1.矩阵的维度由它…

城市形态计算方法

1、天空可视率(Sky view factor sky) (1)准备地形数据、带高度的建筑矢量数据 (2)将建筑矢量数据投影栅格,利用栅格计算器和镶嵌至新栅格得到带有建筑高度数据的地形数据 (3&…

[Windows] 屏幕截图工具Snipaste 开发过程更轻松

前言 老大:你去把用户登录代码写完。 老大:你把这周的周报发一下 老大:你把生产的数据清理一下。 结果… 今天刚把登录代码写完,下班,明天就处理别的事情去了!!! 之后我就… 直接…

MATLAB智能算法 - AntColonyOptimization蚁群算法

AntColonyOptimization蚁群算法 智能算法是路线规划、深度学习等等一系列领域所使用的优化算法,是算法进阶之路的必备之路。 前言:本文主要围绕解决TSP旅行商问题展开,对于机器人的路线规划以及非线性方程求解的问题等解决方案 对于一些其他优…

线上找工作小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 这款线上找工作小程序源码系统是一款集成了岗位发布、简历投递、在线沟通等核心功能的一站式解决方案。系统采用主流的技术栈开发,如PHP后端配合MySQL数据库,前端则利用了Vue.js框架或原生微信小程序技术,确保了系统的高性能与良好…

AWS账号与邮箱的关系解析

在当今数字化时代,云计算服务的普及使得越来越多的企业和个人用户开始使用亚马逊网络服务(AWS)。作为全球领先的云服务平台,AWS为用户提供了丰富的计算、存储和数据库服务。然而,对于许多新用户来说,关于AW…

IT圈大实话!卷运维不如卷网络安全

前言 在刚刚过去的金九银十,我进行了多场网络安全的技术面试,我发现最近很多从事运维的选择了辞职,转行到了网络安全这个发展路线。 说实话,运维工程师这个岗位在IT行业里面确实是处于最底层的,不管什么环节出现问题…

从“寻鲜市集”看巴奴产品主义的「新生命力」

【潮汐商业评论/原创】 “这个就是获得‘国家地理标志产品’的金阳青花椒,七分麻三分香,是麻辣火锅的灵魂;这个菌汤用了3种云南野生牛肝菌熬制,味道鲜香,口感顺滑;还有这个龙竹鲜笋可不得了,它…

【基于docker的深度学习训练环境】关键步骤记录

最近给公司搭建了一个小型的深度学习环境,实现了多人通过SSH对GPU资源的利用,下面对一些关键架构和易用性部分进行记录。 一、整体软硬件框架 1、硬件配置,采用的双GPU的方案,两块消费级显卡。 2、应用层架构 宿主机系统为ubunt…

猎板PCB:军工武器系统中的PCB线路板技术要求

PCB线路板在军工武器系统中的应用非常广泛,它们是现代军事装备中不可或缺的组成部分。军工级PCB因其在极端环境下的稳定性和可靠性而受到重视,这些环境可能包括高温、低温、高湿度、强辐射、高震动等条件。以下是一些关键点,概述了PCB线路板在…

基于华为云智慧生活生态链设计的智能鱼缸

一. 引言 1.1 项目背景 随着智能家居技术的发展和人们对高品质生活的追求日益增长,智能鱼缸作为一种结合了科技与自然美的家居装饰品,正逐渐成为智能家居领域的新宠。本项目旨在设计一款基于华为云智慧生活生态链的智能鱼缸,它不仅能够提供…

vue3播放m3u8格式hls监控流

1. 摄像头的hls监控流不同于普通m3u8的视频,video标签,iframe,videojs,vue-video-player无法解析 2. 解决办法 更换LivePlayer插件 官网https://www.liveqing.com/docs/manuals/LivePlayer.html#%E5%B1%9E%E6%80%A7-property 3…

kubernets(二)

集群操作 查看集群信息 kubectl get查看各组件信息 格式:kubectl get 资源类型 【资源名】 【选项】 events #查看集群中的所有日志信息 -o wide # 显示资源详细信息,包括节点、地址... -o yaml/json #将当前资源对象输出至 yaml/json 格式文…