Python数据结构之树的全面解读
作者:Paranoid☆ 发布时间:2021-12-26 14:32:01
前言
提示:以下是本篇文章正文内容
🧡基本概念
🌳树的定义
树是n(n≥0)个结点的有限集合,n = 0时,称为空树,这是一种特殊情况
在任意一棵非空树中应满足:
①有且仅有一个特定的称为根的结点
②当n > 1时,其余结点可分为m(m > 0)个互不相交的有限集合T1,T2,…,Tm,其中每个集合本身又是一棵树,并且称为根结点的子树==
∅ 空树——结点数为0的树
非空树的特性:
有且仅有一个根节点
除了根节点外,任何一个结点都有且仅有一个前驱
每个结点可以有0个或多个后继
🌲基本术语
1.度
(1)结点的度:结点所拥有的子树的个数
(2)树的度:树中各结点度的最大值
A的度为3,同时也是树的度,B的度为2
2.叶子节点和分支节点
(1)叶子节点
度为0的节点,也称为终端结点
(2)分支节点
度不为0的节点,也称为非终端结点
在上图中,K,L,M,F,G,I,J均为叶子节点
3.双亲与孩子
(1)祖先结点:对于任何节点n ,它的祖先是位于根到节点n之间的路径上的节点
(2)子孙结点:一个结点含有的子树的根结点的子节点
在树中,如果有一条路径从节点x到节点y,则称x为y的祖先,y为x的子孙
(3)双亲结点(父节点):若一个结点含有子结点,则这个结点称为其子结点的父节点
(4)孩子结点:一个结点含有的子树的根结点称为该结点的子结点
(5)兄弟结点:具有相同父结点的结点互称为兄弟结点
(6)堂兄弟结点:如果树的两个节点深度相同,但父节点不同,则它们是一对堂兄弟节点
B,C,D互为兄弟节点,E,G,I互为堂兄弟节点,B为E,F的父节点,而E,F为B的子节点
(4)树的深度
节点所在层数:根节点的层数为1,对于其他任何节点,若某节点在第K层,则其孩子节点在K+1层
树的深度:树中所有节点的最大层数,也称为高度
在上图中,树的深度为4
(5)树的类型
有序树:树中结点的各子树从左至右是有次序的,不能互换
无序树:树中结点的各子树从左至右是无次序的,可以互换
注:在数据结构中,一般的讨论的一般是有序树
(6)森林
森林是m(m≥0)棵互不相交的树的集合,m可为0,空森林
💚树的逻辑结构
树的遍历:从根节点出发,按照某种次序访问树中所有的节点,使得每个节点被访问一次且仅被访问一次
访问:抽象操作,可以是对节点进行的各种处理,这里简化为输出节点的数据
遍历的实质:树的结构(非线性结构) – > 线性结构
树通常有前序(根)遍历,后序(根)遍历,层序(次)遍历三种
🍉前序遍历
树的前序遍历操作定义为:若树为空,则空操作返回;否则:
(1)先访问根节点
(2)然后按照从左到右的顺序前序遍历根节点的每一颗子树
如图前序遍历序列:A–>B–>D–>E–>H–>I–>F–>C–>G
🍓后序遍历
树的后序遍历操作定义为:若树为空,则空操作返回;否则:
(1)先按照从左到右的顺序后序遍历根节点的每一颗子树
(2)最后访问根节点
如图后序遍历序列:D–>H–>I–>E–>F–>B–>G–>C–A
🍒层序遍历
树的层序遍历操作定义为:从树的第一层(即根节点)开始,自上而下的逐层遍历,在同一层中,按照从左到右的顺序对节点逐个访问
如图层序遍历序列:A–>B–>C–>D–>E–>F–>G–>H–>I
💜树的存储结构
实现树的存储结构,关键在于表示树中的节点之间的关系
🍀双亲表示法
基本思想:用一维数组来存储树的各个节点(一般按层序存储),数组中的一个元素对应树中的一个节点,包括节点的数据信息和节点的双亲在数组中的下标。
节点结构
struct PNode
{
DataType data; //数据域
int parent; //指针域,双亲在数组中的下标
}
树的双亲表示法实质上是一个静态链表
如图所示:
还可以将孩子节点或者兄弟节点的下标也进行存储
🍁孩子链表表示法
将结点的所有孩子放在一起,构成线性表
基本思想:把每个结点的孩子排列起来,看成是一个线性表,且以单链表存储,则n个结点共有n个孩子链表。这n个单链表共有n个头指针,这n个头指针又组成了一个线性表,为了便于进行查找采用顺序存储。最后, 将存放n个头指针的数组和存放n个结点的数组结合起来,构成孩子链表的表头数组
链表中的每个节点包含一个数据域和多个指针域,每个指针域指向该节点的一个孩子节点
方案一:
指针域的个数等于树的深度
缺点:浪费存储空间
方案二:
指针域的个数等于该结点的度
缺点:每个结点结构不一致
孩子节点
struct CTNode
{
int child;
CTNode *next; // 指向下一个孩子结点的指针
}
表头结点
struct CBNode
{
DataType data;
CTNode *firstChild; // 每个链表的头指针
}
存储结构
🍃双亲孩子表示法
在孩子链表中表头数组添加了节点的双亲结点
🍂孩子兄弟表示法
某节点的第一个孩子是唯一的,某一节点的右兄弟是唯一的,设置两个分别指向该节点的第一个孩子和右兄弟的指针
struct TNode
{
DataType data;
TNode *firstChild,*rightSib;
}
来源:https://blog.csdn.net/qq_53144843/article/details/121082631
猜你喜欢
- Python 提供了很多内置的工具函数(Built-in Functions),在最新的 Python 3 官方文档中,它列出了 69 个。
- 需求给定一个日期,格式如 “2020-2-12”,计算出这个日期是 2020 年的第几天?实现思路使用 tkinter 和 tkinter.
- SQL Server 2005 远程连接配置TCP/IP属性.Surface Area Configuration –> Databa
- 本文实例讲述了python异常处理用法。分享给大家供大家参考,具体如下:之前用Java的时候,在容易出错的地方我们经常使用try…catch
- 因公司服务器上部署应用较多,在有大并发访问、业务逻辑有问题的情况下反复互相调用或者有异常流量访问的时候,需要对业务应用进行故障定位,所以利用
- 1 安装nginx下载windows上的nginx最新版本,http://www.nginx.org/en/download.html。解压
- Python:type、object、classPython: 一切为对象>>> a = 1>>> ty
- 雅虎的BrowserPlus在曝光了N久后终于发布了,一款类似于Google Gears的浏览器增强插件。在支持的操作系统方面,Gears明
- 本文实例讲述了PHP5.6读写excel表格文件操作。分享给大家供大家参考,具体如下:测试环境:php5.6.24.这块没啥兼容问题。需要更
- 浏览网页的时候经常会碰到一些不认识的英文单词,或者想知道一些中文单词的翻译,这时候再去找翻译软件或者翻译网站就有些麻烦了。因此我做了一个“中
- Celery是Python开发分布式任务列队的处理库。可以异步分布式地异步处理任务,也可定时执行任务等等。通常我们可以使用celery在Dj
- 今天发现 WordPress 连接不上数据库,登录 window server 服务器查看,所有服务均运行正常。使用 root 账号登录 m
- 目录一、对比数据类型二、可变集合构造方法三、不可变集合的构造方法四、集合构造注意事项 Python集合又是一种新的数据类型,集合有
- 简介想写一个登录注册的demo,但是以前的demo数据都写在程序里面,每一关掉程序数据就没保存住。。于是想着写到配置文件里好了Python自
- 产生跨域问题的原因跨域问题是浏览器同源策略限制,当前域名的js只能读取同域下的窗口属性。跨域问题产生的场景当要在在页面中使用js获取其他网站
- 模型经过训练测试之后,我们往往用一两张图对模型预测结果进行分析讨论,那么下面介绍在keras中用已训练的模型经过测试的方法。下面是以利用预训
- ASCII码转换为int:ord('A') 65int转为ASCII码:chr(65) 'A'题目内容:实现
- 每个函数创建时默认带有一个prototype属性,其中包含一个constructor属性,和一个指向Object对象的隐藏属性__proto
- 题目输入一个正整数数组,把数组里面的所有属猪拼接起来成为一个数打印能拼接起来的所有数字中最大/最小的那个。思考直观想法就是求出这个数组中所有
- 前言Python可以操作Excel的模块不止一种,我习惯使用的写入模块是xlwt(一般都是读写模块分开的)python中使用xlwt操作ex