C++之---树/数据结构

news2024/11/15 19:50:30

一、树
什么是树?
1.1 树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。在任意一棵非空树中:
(1) 有且仅有一个特定的称为根(Root)的结点;
(2) 当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、…Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。
1.2 度:结点拥有的子树数称为结点的度(Degree)。
树的度是树内各结点的度的最大值。
二者关系:结点的子树的根称为该结点的孩子,相应地,该结点称为孩子的双亲(Parent)。同一个双亲的孩子之间互称兄弟(Sibling)。结点的祖先是从根到该结点所经分支上的所有结点。以某结点为根的子树中的任一结点都称为该结点的子孙。
1.3 其他相关概念:结点的层次(Level)从根开始定义起,根为第一层,根的孩子为第二层。双亲在同一层的结点互为堂兄弟。树中结点的最大层次称为树的深度或高度。
1.4 森林是m(m>=0)棵互不相交的树的集合。

二、树的存储
2.1 双亲表示法
在每个结点中,附设一个指示器指示其双亲结点到链表中的位置。
在这里插入图片描述
在这里插入图片描述
如图所示:A是没有双亲的所以它的parent的值是-1.
双亲表示法的结点结构定义代码:

//双亲表示法的结点结构定义代码
/*树的双亲表示法结点结构定义*/
#define MAX_TREE_SIZE 100
typedef int TElemType;   /*树结点的数据类型,目前暂定为整型*/
typedef struct PTNode   /*结点结构*/
{
 TElemType data;   /*结点数据*/
 int parent;   /*双亲位置*/
}PTNode;
typedef struct
{
 PTNode nodes[MAX_TREE_SIZE];   /*结点数组*/
 int r, n;   /*根的位置和结点*/
}PTree;

2.2 孩子表示法
把每个结点的孩子结点排列起来,以单链表作存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为空。然后n个头指针又组成一个线性表,采用顺序存储结构,存放进一个一维数组中。
在这里插入图片描述
孩子表示法的结构定义代码:

/*树的孩子表示法的定义*/
#define MAX_TREE_SIZE 100
typedef int TElemType;   /*树结点的数据类型,目前暂定为整型*/
typedef struct CTNode   /*孩子结点*/
{
 int child;
 struct CTNode* next;
}*ChildPtr;
typedef struct   /*表头结构*/
{
 TElemType data;
 ChildPtr firstchild;
}CTBox;
typedef struct   /*树结构*/
{
 CTBox nodes[MAX_TREE_SIZE];   /*结点数组*/
 int r, n;   /*根的位置和结点数*/
}CTree;

2.3 双亲孩子表示法:
在这里插入图片描述
如上图所示,双亲孩子表示法就是在孩子表示法的基础之上加上一个存储空间用来存储该结点的双亲结点。
2.4 孩子兄弟表示法(实际上是把一棵复杂的树变成了一棵二叉树)
任意一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。就是把第一个孩子为左指针(firstchild),它的兄弟右指针(rightsib)。
在这里插入图片描述
孩子兄弟表示法结构定义:

typedef struct CSNode
{
 TElem data;
 struct CSNode* firstchild, * rightsib;
}CSNode,*CSTree;

三、二叉树
3.1 二叉树的存储结构
(1) 二叉树顺序存储结构
按照补充为完全二叉树的形式,以数组的方式进行存储,没有的位置为空。
(2) 二叉链表
一个数据域和两个指针域:
在这里插入图片描述

/*二叉树的二叉树链表结点结构定义*/
typedef struct BitNode /* 结点结构*/
{
TElemType data;
struct BiTNode *lchild, *rchild;
} BiTNode,*BiTree;

3.2 二叉树的遍历
二叉树的遍历是指从根结点出发,按照某种次序访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。此处说明树的遍历就像递归一样,每一个结点本身也是一棵树。

前序遍历:根左右
void PreOrderTraverse(BiTree T)
{
if(T==NULL)
return;
printf(%c”,T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
中序遍历:左根右
void InOrderTraverse(BiTree T)
{
if(T==NULL)
return;
InOrderTraverse(T->lchild);
printf(%c”,T->data);
InOrderTraverse(T->rchild);
}
后序遍历:左右根
void PostOrderTraverse(BiTree T)
{
if(T==NULL)
return;
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf(%c”,T->data);
}

3.3 二叉树的建立
在这里插入图片描述
在这里插入图片描述
对于一个普通二叉树来说,仅仅只有一个前序,是无法确定一个二叉树,有一个办法就是将二叉树中的每个结点的空指针引出一个虚结点,其值为一个特值,比如“#”。称这种树为原二叉树的扩展二叉树。扩展二叉树就可以做到一个遍历序列确定一棵二叉树了。把前序遍历序列AB#D##c##用键盘挨个输入就可以了。

/*按前序输入二叉树中结点的值(一个字符)*/
/* #表示空树,构造二叉链表表示二叉树T。*/
void CreateBiTree(BiTree *T)
{
 TElemType ch;
 scanf("%c",&ch);
 if (ch == "#")
  *T = NULL;
 else
 {
  *T = (BiTree)malloc(sizeof(BiTNode));
  if (!*T)
   exit(OVERFLOW);
  (*T)->data=ch; /*生成根结点*/
  CreateBiTree(&(*T)->lchild);/*构造左子树*/
  CreateBiTree(&(*T)->rchild);/*构造右子树*/
 }
}

其实建立二叉树,也是利用了递归的原理。只不过在原来应该是打印结点的地方,改成了生成结点、给结点赋值的操作而已。

四、树、森林与二叉树的转换
4.1 树转换为二叉树
前面所提到的孩子兄弟表示法,实际上就是把树转换为二叉树的方法,在此不再多说。

4.2 森林转换为二叉树
在孩子兄弟表示法转换为二叉树的过程中,就知道根结点是没有右子树的,因为它没有兄弟,所以对于多个树的森林来说,它们就是兄弟,也就是右子树。
在这里插入图片描述
4.3 二叉树转换为树
二叉树转换为树,就是树转换为二叉树的逆过程。
一个结点的左子树,是它的左子树,该左子树的右子树都是该结点的一棵棵右孩子。
在这里插入图片描述
4.4 二叉树转换为森林
就是先把根结点的右子树依次拆开为一棵棵树,再按照二叉树转换为树的方法将一棵棵树转换。

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

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

相关文章

CodeForces..最新行动.[中等].[遍历].[判断]

题目描述: 题目解读: "最近操作"字段会显示最近操作的n个文件。 最初有编号文件1,2,... n在"最近操作"字段,还有其他无限多个文件不在。 当某个文件pi发生操作时: 如果它位于“最近…

小红书账号矩阵优化软件

小红书账号矩阵优化软件 大家有关注过品牌在⼩红书上的打法有哪些吗? #品牌营销#小红书运营#爆文拆解#品牌投放#爆品打造 我们如果确定了我们要去做小红书,那我到底该怎么去做?现在小红书对我们目前这些品牌来说,你们是作为把它…

Allegro16.6详细教程(二)

R.3-D Viewer 3-D Viewer,可以直接在allegro中看到board file的3-D顯示效果。3-D Viewer對於PCB Editor Products,只有環境變數中的OpenGL顯示功能開啟後才有效,而對於APD/SiP是無效的。 2.3-D viewer是在一個獨立的視窗中打開的。3-D environment環境支援多種顯示內容的過…

Spring Cloud Alibaba - Nacos源码分析(二)

目录 一、Nacos服务端服务注册 1、服务端调用接口 2、服务注册 instanceServiceV2.registerInstance EphemeralClientOperationServiceImpl.registerInstance ServiceManager clientManager Client实例AbstractClient ClientOperationEvent.ClientRegisterServiceEven…

2023《中国好声音》全国巡演Channel[V]歌手大赛广州赛区半决赛圆满举行!

2023年5月27-28日,由腾扬广告、Channel[V]、盛娱星汇联合主办的2023《中国好声音》全国巡演Channel[V]歌手大赛广州赛区半决赛在广州番禺天河城正式打响,自广州赛区赛事启动以来,汇集了近五千名音乐人参与其中,历经2个多月、超40场…

【数据库复习】第七章 数据库设计

数据库设计的过程(六个阶段) ⒈需求分析阶段 准确了解与分析用户需求(包括数据与处理) 最困难、最耗费时间的一步 ⒉概念结构设计阶段 整个数据库设计的关键 通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型 ⒊…

基于微信小程序蛋糕店商城管理系统的设计与实现

1:后端采用技术 SpringBoot 、Mybatis、Mybatis-plus、Redis、阿里云短信息服务、Hutool 邮箱服务、WebSocket通讯服务、OSS对象存储服务、支付宝沙箱服务,接口简单限流、简单定时任务。。。。。。 2:前端采用技术 Vue2、Vue2-uploader组件、…

[图表]pyecharts模块-日历图

[图表]pyecharts模块-日历图 先来看代码: import random import datetimeimport pyecharts.options as opts from pyecharts.charts import Calendarbegin datetime.date(2017, 1, 1) end datetime.date(2017, 12, 31) data [[str(begin datetime.timedelta(d…

Leetcode 110-平衡二叉树

1. 递归法求解 递归三部曲: 确定递归函数的参数及其返回值确定终止条件确定单层递归逻辑 深度:从上往下 高度:从下往上 1.1 根据深度求解 构建求二叉树节点深度的函数(后序遍历)递归求该树是否是平衡二叉树&#…

国产化麒麟linux系统开发编译常见问题汇总

团队自研股票软件关注威信龚总号:QStockView,下载 1 问题处理 1.1 Unknown module in QT:QJsonDocument 缺少QJsonDocument 解决方法: Pro文件中加上 QTcore; 播放器库问题 1.2 代码中汉字乱码需要设置文件编码格式 原因分析&…

2023-06-03:redis中pipeline有什么好处,为什么要用 pipeline?

2023-06-03:redis中pipeline有什么好处,为什么要用 pipeline? 答案2023-06-03: Redis客户端执行一条命令通常包括以下四个阶段: 1.发送命令:客户端将要执行的命令发送到Redis服务器。 2.命令排队&#…

内网安全:Cobalt Strike 工具 渗透多层内网主机.(正向 || 反向)

内网安全:Cobalt Strike 工具 渗透多层内网主机. Cobalt Strike 是一款以 metasploit 为基础的 GUI 的框架式渗透工具,又被业界人称为 CS。拥有多种协议主机上线方式,集成了端口转发,服务扫描,自动化溢出,…

Docker容器化Java程序

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Docker容器化Java程序 Docker:用于创建和管理容器的开源平台 Java运行环境:Java是一个跨平台的编程语言,因此在CentOS系统中需要安…

一个帮助写autoprefixer配置的网站

前端需要用到postcss的工具,用到一个插件叫autoprefixer,这个插件能够给css属性加上前缀,进行一些兼容的工作。 如何安装之类的问题在csdn上搜一下都能找到(注意,vite是包含postcss的,不用在项目中安装pos…

[图表]pyecharts模块-柱状图2

[图表]pyecharts模块-柱状图2 先来看代码&#xff1a; from pyecharts import options as opts from pyecharts.charts import Bar from pyecharts.faker import Fakerx Faker.dogs Faker.animal xlen len(x) y [] for idx, item in enumerate(x):if idx < xlen / 2:y…

Visual Studio Code里如何运行html (Windows 10 和 Mac OS)

在Web 开发时&#xff0c;作为Web 开发基本都是从编写 HTML 网页开始的。这篇文章讲的是如何起步配置开发环境来运行 HTML 代码。 在Windows和Mac 的 VS Code中都可以运行 HTML。 打开VS Code&#xff0c;在VS Code中安装&#xff0c;Code Runner&#xff0c; 如下所示 2、这…

【群智能算法改进】一种改进的算术优化算法 改进算术优化算法 改进AOA[1]【Matlab代码#37】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 基础算术优化算法2. 改进算术优化算法2.1 随机概率因子2.2 强制切换机制 3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节&#xff1a;资源获取】 1. 基础算术优化算法 算术优化算法是一类基于…

mount -l | grep bpf

BPF & Cillum mount -l | grep bpfBPF&#xff08;Berkeley Packet Filter&#xff09;文件系统netfilter和tcprofiling和tracingHTTP、gRPC和Kafka等协议VXLAN组网模式BGP&#xff08;Border Gateway Protocol&#xff09; mount -l | grep bpf 这是一个通过运行mount -l…

Linux 实操篇-Linux 磁盘分区、挂载

Linux 实操篇-Linux 磁盘分区、挂载 Linux 分区 原理介绍 Linux 来说无论有几个分区&#xff0c;分给哪一目录使用&#xff0c;它归根结底就只有一个根目录&#xff0c;一个独立且唯一的文件结构, Linux 中每个分区都是用来组成整个文件系统的一部分。Linux 采用了一种叫“载…

使用数据库连接池来快速访问数据库Druid

使用数据库连接池来快速访问数据库Druid 简介为什么使用连接池原理及使用连接池访问数据库的优势开源项目 alibaba/druid 地址 使用方法准备jar包定义Druid的配置文件 代码示例 简介 数据库连接池是一个容器&#xff0c;负责分配、管理数据库的连接(Connection)。通过连接池可…