树结构

数据结构——树与二叉树

和自甴很熟 提交于 2020-03-29 19:01:14
目录 导言 什么是树 树结构定义 树的结点 结点分类 结点的联系 结点的层次 有序树 森林 相比线性结构 树的存储结构 双亲表示法 结构体定义 描述法举例 孩子表示法 描述法举例 结构体定义 孩子兄弟表示法 描述法举例 二叉树 二叉树的定义 特殊的二叉树 斜树 满二叉树 完全二叉树 二叉树的性质 二叉树的存储结构 顺序存储 链式存储 结构体定义 二叉树的基本操作 二叉树的遍历 从斐波那契数列说起 遍历算法 建立二叉树 拓展二叉树 建树算法 复制二叉树 获取二叉树的深度 统计二叉树的结点数 线索二叉树 描述前驱与后继 线索二叉树结点结构体定义 线索化 遍历线索二叉树 参考资料 导言 轩辕剑是一个经典的中文角色扮演游戏,通过对历史内容的考究,与精彩感人的剧情结合,使得这个系列被公认为华人世界的两大经典角色扮演游戏系列之一。我最为喜欢的两部是《轩辕剑叁:云和山的彼端》和《轩辕剑叁外传:天之痕》,剧情感人精彩、别有深意,2D的场景细致美观、独具特色……当然,我这次仍然不是来给你推荐游戏的,而是想对其中一个场景做点文章。 “建木”是上古先民崇拜的一种圣树,传说建木是沟通天地人神的桥梁,在《轩辕剑叁外传:天之痕》中的仙山岛,利用水墨画的风格进行了描绘,是我最喜欢的游戏场景之一。其中就有对“海中建木”的描绘。“海中建木”无疑是一颗巨大的树,这棵树也肯定是由无数的根、枝、叶组成的,如果我们把

四叉树空间索引原理及其实现

自古美人都是妖i 提交于 2020-03-22 11:37:40
转自原文 四叉树空间索引原理及其实现 四叉树索引的基本思想是将地理空间递归划分为不同层次的树结构。它将已知范围的空间等分成四个相等的子空间,如此递归下去,直至树的层次达到一定深度或者满足某种要求后停止分割。四叉树的结构比较简单,并且当空间数据对象分布比较均匀时,具有比较高的空间数据插入和查询效率,因此四叉树是GIS中常用的空间索引之一。常规四叉树的结构如图所示,地理空间对象都存储在叶子节点上,中间节点以及根节点不存储地理空间对象。 四叉树示意图 四叉树对于区域查询,效率比较高。但如果空间对象分布不均匀,随着地理空间对象的不断插入,四叉树的层次会不断地加深,将形成一棵严重不平衡的四叉树,那么每次查询的深度将大大的增多,从而导致查询效率的急剧下降。 本节将介绍一种改进的四叉树索引结构。四叉树结构是自顶向下逐步划分的一种树状的层次结构。传统的四叉树索引存在着以下几个缺点: (1)空间实体只能存储在叶子节点中,中间节点以及根节点不能存储空间实体信息,随着空间对象的不断插入,最终会导致四叉树树的层次比较深,在进行空间数据窗口查询的时候效率会比较低下。 (2)同一个地理实体在四叉树的分裂过程中极有可能存储在多个节点中,这样就导致了索引存储空间的浪费。 (3)由于地理空间对象可能分布不均衡,这样会导致常规四叉树生成一棵极为不平衡的树,这样也会造成树结构的不平衡以及存储空间的浪费。 相应的改进方法

树和二叉树介绍

戏子无情 提交于 2020-02-28 17:56:56
树 树形结构 是数据元素(结点)之间有分支,并且具有层次关系的结构,可用于表示数据元素之间存在的一对多关系。 树(Tree) 是由n(n≥0)个结点构成的有限集合,当n=0时称为空树。若树非空,则具有以下两个性质: (1)有且仅有一个特定的结点,称为根(Root)。 (2)其余的结点可分为m个互不相交的集合T1,T2,…,Tm,其中每一个集合都是一棵树,并且称为根的子树( Subtree)。 如下图所示是有13个结点的树,A是根,其余结点分成三个互斥的集合T1={B,E,F,K,L}、T2={C,G}、T3={D,H,I,J,M},T1、T2、T3都是A的子树,其本身也是一棵树。 树形结构图 树的基本术语: 树结点( Tree Node) :树中一个独立单元。包含一个数据元素及若干指向其子树的分支,如上图中的A、B、C、D等。 树根(Root) :树中唯一没有前驱的结点,如上图中的A结点。 结点的度( Node Degree) :结点拥有的子树数,称为结点的度。例如,在上图中A的度为3,B的度为2,K的度为0。 树的度( Tree Degree) :树中各结点的度的最大值。如上图中树的度为3。 树叶(Leaf) :度为0的结点。例如,在图中,K、L、F、G、1、J、M都是树叶,也称叶结点。除根和叶子以外的其他结点称为中间结点。 双亲( Parent)和孩子( Child)

【数据结构】树的存储结构

杀马特。学长 韩版系。学妹 提交于 2020-01-21 01:40:12
图源: 鱼C-小甲鱼 文章目录 孩子表示法 方案一 方案二 双亲表示法 方案一 方案二 双亲孩子表示法 孩子表示法 方案一 方案二 双亲表示法 方案一 方案二 双亲孩子表示法 具体实现 # define MAX_TREE_SIZE 100 typedef char ElemType ; //孩子结点 typedef struct CTNode { int child ; //孩子结点的下标 struct Node * next ; //指向下一个孩子结点的指针 } * ChildPtr ; //表头结构 typedef struct { ElemType data ; //存放在树中的结点的数据 int parent ; //存放双亲的下标 ChildPtr firstchild ; //指向第一个孩子的指针 } CTBox ; //树结构 typedef struct { CTBox nodes [ MAX_TREE_SIZE ] ; //结点数组 int r ; //根的位置 int n ; //结点数 } ; 来源: CSDN 作者: 阿腾木 链接: https://blog.csdn.net/qq_15989473/article/details/104055674

从B树、B+树、B*树谈到R 树

。_饼干妹妹 提交于 2020-01-13 05:09:46
http://blog.csdn.net/v_july_v/article/details/6530142 第一节、B树、B+树、B*树(原文部分摘录) 1.前言: 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree), 红黑树 (Red-Black Tree ),B-tree/B + -tree/ B * -tree (B~Tree)。前三者是典型的二叉查找树结构,其查找的时间复杂度 O (log 2 N )与树的深度相关,那么降低树的深度自然会提高查找效率。 但是咱们有面对这样一个实际问题:就是大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于 树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下 (为什么会出现这种情况,待会在外部存储器-磁盘中有所解释),那么如何减少树的深度(当然是不能减少查询的数据量),一个基本的想法就是:采用 多叉树 结构(由于树节点元素数量是有限的,自然该节点的子树数量也就是有限的)。 也就是说,因为磁盘的操作费时费资源,如果过于频繁的多次查找势必效率低下。那么如何提高效率,即如何避免磁盘过于频繁的多次查找呢

B-/B+树 MySQL索引结构

限于喜欢 提交于 2020-01-01 04:23:14
索引 索引的简介 简单来说,索引是一种数据结构 其目的在于提高查询效率 可以简单理解为“排好序的快速查找结构” 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在中磁盘上 我们一般所说的索引,如果没有特殊说明的话,就是指B+树结构组织的索引。其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+树索引。 一般java开发知道这些基本够用了 索引的优势 类似大学图书馆建数目索引,提高数据检索效率,降低数据库的io成本 通过索引对数据进行排序,降低数据排序成本,降低了cpu的 劣势 索引实际上也是一张表,保存了主键和索引字段,并指向实体表的记录,所以索引列也要空间 虽然索引大大提高了查询速度,但是会降低更新表的速度,如对表进行insert,update和delete。因为更新表时,mysql不仅要保存数据,还要保存一下索引文件每次添加了索引列的字段 索引只是提高效率的一个因素,如果你的mysql有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。 索引的使用 单值索引 唯一索引 复合索引 基本语法 show index from TableName;(查看表的索引) eg:show index from city; create [unique] index indexname(索引名称) on TableName

算法原理系列:2-3查找树

你。 提交于 2019-12-08 04:22:30
2-3查找树 第一次接触它是在刷数据结构那本书时,有它的介绍。而那时候只是单纯的理解它的节点是如何分裂,以及整个构建过程,并不清楚它的实际用处,所以看了也就忘了。而当看完《算法》查找章节时,顿时有种顿悟,喔,原来如此啊。所以,提出来的这些有趣的结构千万不能割裂来看,它的演变如此诱人,细节值得品味。 结构缘由 首先,搞清楚2-3查找树为什么会出来,它要解决什么样的问题?假设我们对它的基本已经有所了解了。先给它来个简单的定义: 2-3查找树: 一种保持有序结构的查找树。 可以维持动态平衡的有序查找树。 从上述定义就可以看出,它到底是为了解决什么问题,在上一篇文章中,介绍了【查找】的演变过程,详细请参看博文 这里 。其中最后优化到了BST这种树的结构。但我们都知道BST它对数据的输入是敏感的,如最坏情况下,每次 put() 的 key 是有序的,那么构造出来的 BST 树,就相当于一个链表,那么对于每个元素的查找,它的性能就相当糟糕。而2-3树就是为了规避上述问题而设计发明出来的模型。现在请思考该如何设计它呢? 这里我们从BST遇到的实际问题出发,提出设计指标,再去思考利用些潜在的性质来构建2-3树。这部分内容,没有什么理论根据,而是我自己尝试去抓些字典的性质来构建,而2-3树的诞生过程并非真的如此,所以仅供参考。 构建2-3树 字典的两个主要操作为:查找和插入。而在前面一篇文章说到

初识树与二叉树(基本知识讲解与常见实现)

你。 提交于 2019-12-04 03:56:58
二叉树铺垫——树 前面几篇文章我们主要介绍的线性表,栈,队列,串,等等,都是一对一的 线性结构 ,而今天我们所讲解的 “树” 则是一种典型的 非线性结构 ,非线性结构的特点就是,任意一个结点的直接前驱,如果存在,则一定是唯一的,直接后继如果存在,则可以有多个,也可以理解为一对多的关系,下面我们就先来认识一下树 树的概念 下图我们日常生活中所见到的树,可以看到,从主树干出发,向上衍生出很多枝干,而每一根枝干,又衍生出一些枝丫,就这样组成了我们在地面上可以看到的树的结构,但对于每一个小枝丫来讲,归根结底,还是来自于主树干的层层衍生形成的。 我们往往需要在计算机中解决这样一些实际问题 例如: 用于保存和处理树状的数据,例如家谱,组织机构图 进行查找,以及一些大规模的数据索引方面 高效的对数据排序 先不提一些复杂的功能,就例如对于一些有树状层级结构的数据进行建模,解决实际问题,我们就可以利用 “树” 这种结构来进行表示,为了更符合我们的习惯,我们一般把 “树” 倒过来看,我们就可以将其归纳为下面这样的结构,这也就是我们数据结构中的 “ 树” 树中的常见术语 结点 :包含数据项以及指向其他结点的分支,例如上图中圆 A 中,既包含数据项 A 又指向 B 和 C 两个分支 特别的,因为 A 没有前驱,且有且只有一个,所以称其为根结点 子树 :由根结点以及根结点的所有后代导出的子图称为树的子树

树和二叉树一篇就搞定!

[亡魂溺海] 提交于 2019-12-04 03:42:46
二叉树铺垫——树 前面几篇文章我们主要介绍的线性表,栈,队列,串,等等,都是一对一的 线性结构 ,而今天我们所讲解的 “树” 则是一种典型的 非线性结构 ,非线性结构的特点就是,任意一个结点的直接前驱,如果存在,则一定是唯一的,直接后继如果存在,则可以有多个,也可以理解为一对多的关系,下面我们就先来认识一下树 树的概念 下图我们日常生活中所见到的树,可以看到,从主树干出发,向上衍生出很多枝干,而每一根枝干,又衍生出一些枝丫,就这样组成了我们在地面上可以看到的树的结构,但对于每一个小枝丫来讲,归根结底,还是来自于主树干的层层衍生形成的。 我们往往需要在计算机中解决这样一些实际问题 例如: 用于保存和处理树状的数据,例如家谱,组织机构图 进行查找,以及一些大规模的数据索引方面 高效的对数据排序 先不提一些复杂的功能,就例如对于一些有树状层级结构的数据进行建模,解决实际问题,我们就可以利用 “树” 这种结构来进行表示,为了更符合我们的习惯,我们一般把 “树” 倒过来看,我们就可以将其归纳为下面这样的结构,这也就是我们数据结构中的 “ 树” 树中的常见术语 结点 :包含数据项以及指向其他结点的分支,例如上图中圆 A 中,既包含数据项 A 又指向 B 和 C 两个分支 特别的,因为 A 没有前驱,且有且只有一个,所以称其为根结点 子树 :由根结点以及根结点的所有后代导出的子图称为树的子树

数据结构与算法——平衡二叉树

旧城冷巷雨未停 提交于 2019-12-01 21:34:38
1 引言 2 二叉搜索树 2.1 定义 2.2 性质 2.3 节点结构 2.4 创建二叉搜索树 2.5 查找 2.6 插入 2.7 删除 3 平衡二叉树 3.1 定义 3.2 平衡因子 3.3 节点结构 3.4 左旋与右旋 3.5 插入 1 引言   二叉树是数据结构中的重点与难点,也是应用较为广泛的一类数据结构。二叉树的基础知识在之前的数据结构与算法——二叉树基础中已经详细介绍。本篇文章将着重介绍两类二叉树,二叉搜索树和平衡二叉树。 2 二叉搜索树 2.1 定义   二叉搜索树又称二叉查找树,亦称为二叉排序树。设x为二叉查找树中的一个节点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个节点,则key[y] <= key[x];如果y是x的右子树的一个节点,则key[y] >= key[x]。 2.2 性质   (1)若左子树不空,则左子树上所有节点的值均小于它的根节点的值;   (2)若右子树不空,则右子树上所有节点的值均大于它的根节点的值;   (3)左、右子树也分别为二叉搜索树;   例如:图2.2.1所示的二叉树为一棵二叉搜索树。 图2.2.1   例如:图2.2.2所示不是一棵二叉搜索树,因为节点40的左孩子节点值为44,不满足二叉搜索树的定义。 图2.2.2 2.3 节点结构   二叉树的节点结构通常包含三部分,其中有:左孩子的指针