数据结构动图展现网站html
树(英语:tree)是一种抽象数据类型(ADT)或是实做这种抽象数据类型的数据结构,用来模拟具备树状结构性质的数据集合。它是由n(n>=1)个有限节点组成一个具备层次关系的集合。把它叫作“树”是由于它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具备如下的特色:mysql
每一个节点有零个或多个子节点;git
没有父节点的节点称为根节点;github
每个非根节点有且只有一个父节点;算法
除了根节点外,每一个子节点能够分为多个不相交的子树;sql
节点的度:一个节点含有的子树的个数称为该节点的度;数据库
树的度:一棵树中,最大的节点的度称为树的度;数据结构
叶节点或终端节点:度为零的节点;框架
父亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;机器学习
孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;
兄弟节点:具备相同父节点的节点互称为兄弟节点;
节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
树的高度或深度:树中节点的最大层次;
堂兄弟节点:父节点在同一层的节点互为堂兄弟;
节点的祖先:从根到该节点所经分支上的全部节点;
子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
森林:由m(m>=0)棵互不相交的树的集合称为森林;
每一个节点最多含有两个子树的树称为二叉树
若是已知中序和先序,或者中序和后序,能够肯定二叉树的结构
eg:
先序:A B C D E F
中序: C B A E D F
先序找根,中序定两边
先序遍历序列为ABCDEF,第一个字母是A被打印出来,就说明A是根结点的数据。
再由中序遍历序列是CBAEDF,能够知道C和B是A的左子树的结点,
E、D、F是A的右子树的结点
而后咱们看先序中的C和B,它的顺序是ABCDEF,B是在C的前面打印,因此B应该是A的左孩子,而C就只能是B的孩子,此时是左仍是右孩子还不肯定。再看中序序列是CBAEDF,C是在B的前面打印,这就说明C是B的左孩子,不然就是右孩子了
再看先序中的E、D、F,它的顺序是ABCDEF,那就意味着D是A结点的右孩子,E和F是D的子孙,注意,它们中有一个不必定是孩子,还有多是孙子的。再来看中序序列是CBAEDF,因为E在D的左侧,而F在右侧,因此能够肯定E是D的左孩子,F是D的右孩子
注:若是已经先序和后序没法判断二叉树结构
先序序列:ABC
后序序列:CBA
咱们能够肯定A必定是根结点,但接下来,咱们没法知道,哪一个结点是左子树,哪一个是右子树
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
全部左子树和右子树自身必须也是二叉搜索树
参考如下两篇文章(最好是本身画图容易理解):
Python实现平衡二叉树 删除和添加调整的是最小不平衡子树
平衡二叉树 (Height-Balanced Binary Search Tree) 是一种二叉排序树,
其中每个结点的左子树和右子树的高度差不超过1(小于等于1)
二叉树的平衡因子 (Balance Factor) 等于该结点的左子树深度减去右子树深度的值称为平衡因子。平衡因子只多是[-1,0,1]。距离插入结点最近的,且平衡因子的绝对值大于1的结点为根的子树,称为最小不平衡子树
平衡二叉树就是二叉树的构建过程当中,每当插入一个结点,看是否是由于树的插入破坏了树的平衡性,如果,则找出最小不平衡树。在保持二叉树特性的前提下,调整最小不平衡子树中各个结点之间的连接关系,进行相应的旋转,使之成为新的平衡子树。简记为: 步步调整,步步平衡
参考如下两篇文章(最好是本身画图):
注:第一篇文章中针对左右失衡和右左失衡的处理图片和代码中有误,可是主要是看我的理解,做者能够只对根节点进行失衡处理,而我这边是按照第二篇文章说的,调整最小不平衡子树
对于其中添加元素的递归代码的理解:
(用于信息编码):带权路径最短的二叉树称为哈夫曼树或最优二叉树;
应用: 压缩文件
一种对读写操做进行优化的自平衡的二叉查找树,可以保持数据有序,拥有多余两个子树。B树是多路平衡查找树,2阶B树才是平衡二叉树
应用: 数据库存储
M阶的Btree的几个重要特性:
M阶: 这个由磁盘的页大小决定,页内存是4KB, 好处是一次性取数据就能够取出这个节点即这个页数据,不会形成IO读取的浪费。
适合大数据的磁盘索引,经典的MySQL,全部的数据都存在叶子节点,其余上层节点都是索引,增长了系统的稳定性以及遍历查找效率。叶子节点之间是双向指针,这一点就有利于范围查找。
MyISAM存储引擎的数据结构(非汇集)
索引文件和数据文件是分离的,非汇集(非聚族)
.MYD 存储数据的文件
.MYI 存储索引的文件
.FRM 表结构文件,管理索引和数据的框架
InnoDB索引的实现(汇集)
联合索引的底层存储结构