JavaScript树的数据结构基础概念及特点(非常全)

Posted 十九万里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript树的数据结构基础概念及特点(非常全)相关的知识,希望对你有一定的参考价值。

1、树的基本概念及其类型:

树的数据结构部分:主要参考这个博客1.10.2节,讲的比较详细
树的基本概念和类型

树是一种十分重要的数据结构。树被描述为一种分层数据抽象模型,常用来描述数据间的层级关系和组织结构。树也是一种非顺序的数据结构

如上图所示,一棵完整的树包含一个位于树顶部的节点,称之为根节点(11),它没有父节点。树中的每一个元素都叫做一个节点,节点分为内部节点(图中显示为黄色的节点)和外部节点(图中显示为灰色的节点),至少有一个子节点的节点称为内部节点,没有子元素的节点称为外部节点或叶子节点。一个节点可以有祖先(根节点除外)和后代。子树由节点本身和它的后代组成,如上图中三角虚框中的部分就是一棵子树。节点拥有的子树的个数称之为节点的度,如上图中除叶子节点的度为0外,其余节点的度都为2。从根节点开始,根为第1层,第一级子节点为第2层,第二级子节点为第3层,以此类推。树的高度(深度)由树中节点的最大层级决定(上图中树的高度为4)。

树的分类:

二叉树,二叉搜索树,自平衡树,红黑树,完全树
这点在上面那个博客里面也有详细讲到 这里我就不详细去写 总结一些特性

2、二叉树相关性质

1、节点的度:一个节点含有的子树的个数称为该节点的度
2、叶节点或终端节点:度为零的节点
3、节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,依次类推
4、树的高度或者深度:树中节点的最大层次。
5、在非空二叉树中,第i层的节点总数不超过2^(i-1),i>=1。
6、深度为h的二叉树最多有 2^h-1 个结点(h>=1),最少有 h 个结点。
7、对于任意一颗二叉树,如果其叶节点树为N0,而度数为2的节点总数为N2,则 N0 = N2+1。
8、给定N个节点,能构成h(N)种不同的二叉树,h(N)为卡特兰数的第 N 项。(2n)!/(n!(n+1)!)。
9、二叉树的前序遍历,首先访问根结点,然后遍历左子树,最后遍历右子树。简记根-左-右
10、二叉树的中序遍历,首先遍历左子树,然后访问根结点,最后遍历右子树。简记左-根-右。
11、二叉树的后序遍历,首先遍历左子树,然后遍历右子树,最后访问根结点。简记左-右-根
12、二叉树是非线性数据结构,但是顺序存储结构和链式存储结构都能存储
13、一个带权的无向连通图的最小生成树的权值之后是唯一的
14、只有一个结点的二叉树的度为0。
15、二叉树的度是以节点的最大度数定义的
16、树的后序遍历序列等同于该树对应的二叉树的中序序列
17、树的先序序列等同于该树对应的二叉树先序序列
18、线索二叉树的线索实际上是指向的是相应遍历序列特点节点的前驱节点和后继节点,所以先写出二叉树的中序遍历序列:debxac,中序遍历中在x左边和右边的字符,就是他在中序线索化的左右线索,及b’a。
19、递归式的先序遍历一个 n 节点,深度为 d 的二叉树,需要栈空间的大小为 O(d),因为二叉树并不一定是平衡的,也就是深度 d!=logn,有可能 d>>logn。所以栈大小应该是 O(d)。

20、一棵具有 N 个结点的二叉树的前序序列和后序序列正好相反 ,则该二叉树一定满足该二叉树只有左子树或只有右子树,即该二叉树一定是一条链(二叉树的高度为 N,高度等于结点数)。
21、引入二叉线索树的目的是加快查找结点的前驱或后继的速度。
22、二叉树线索化后,先序线索化与后序线索化最多有 1 个空指针域,而中序线索化最多有 2 个空指针域。
23、不管是几叉树,节点数等于=分叉数+1。
24、任何一棵二叉树的叶子结点在先序、中序和后序遍历中的相对次序不发生改变。

3、满二叉树

对于一棵满二叉树,如果每一个非叶子节点都存在左右子树,并且二叉树中所有的叶子节点都在同一层中,这样的二叉树称为满二叉树、

4、完全二叉树

对于一颗具有n个节点的二叉树按照层次编号,同时,左右子树按照先左后右编号,如果编号为i的子节点与同样深度的满二叉树中编号为i的节点在满二叉树中的位置完全相同,则这颗二叉树称为完全二叉树。
性质:

1、具有 n 个结点的完全二叉树的深度为 K =[log2n」+1(取下整数)。
2、有 N 个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:若 I 为结点编号(从 1 开始编号)则如果 I>1,则其父结点的编号为 I/2。
3、完全二叉树,如果 2 _ I <= N,则其左儿子(即左子树的根结点)的编号为 2 _ I;若 2 _ I > N,则无左儿子;如果 2 _ I + 1 <= N,则其右儿子的结点编号为 2 _ I + 1;若 2 _ I + 1 > N,则无右儿子。

5、平衡二叉树(AVL)

平衡二叉树具有如下几个性质:
1、可以是空树
2、假如不是空树, 任何一个结点的左子树与右子树都是平衡二叉树,并且高度之差的绝对值不超过1.

平衡二叉树是为了解决二叉树中出现链式结构(只有左子树或者只有右子树)的情况,这样的情况出现后对我们查找没有一点帮助的,反而增加了维护的成本。

6、B-树

B-树主要用于文件系统以及部分数据库索引,如 MongoDB。使用 B-树来作为数据库的索引主要是为了减少查找是磁盘的 I/O 次数。试想,如果我们使用二叉查找树来作为索引,那么查找次数的最坏情况等于二叉查找树的高度,由于索引存储在磁盘中,我们每次都只能加载对应索引的磁盘页进入内存中比较,那么磁盘的 I/O 次数就等于索引树的高度。所以采用一种办法来减少索引树的高度是提高索引效率的关键。

B-树是一种多路平衡查找树,它的每一个节点最多包含 K 个子节点,K 被称为 B-树的阶,K 的大小取决于磁盘页的大小。每个节点中的元素从小到大排列,节点当中 k-1 个元素正好是 k 个孩子包含的元素的值域分划。简单来说就是以前一个磁盘页只存储一个索引的值,但 B-树中一个磁盘页中存储了多个索引的值,因此在相同的比较范围内,B-树相对于一般的二叉查找树的高度更小。其实它的主要目的就是每次尽可能多的将索引值加载入内存中进行比较,以此来减少磁盘的 I/O 次数,其实就查找次数而言,和二叉查找树比较差不了多少,只是说这个比较过程是在内存中完成的,速度更快而已。

7、B+树

B+ 树相对于 B-树有着更好的查找性能,根据 B-树我们可以知道,要想加快索引速度的方法就是尽量减少磁盘 I/O 的次数。

B+ 树相对于 B-的主要变化是,每个中间节点中不再包含卫星数据,只有叶子节点包含卫星数据,每个父节点都出现在子节点中,叶子节点依次相连,形成一个顺序链表。中间节点不包含卫星数据,只用来作为索引使用,这意味着每一个磁盘页中能够包含更多的索引值。因此 B+ 树的高度相对于 B-来说更低,所以磁盘的 I/O 次数更少。由于叶子节点依次相连,并且包含了父节点,所以可以通过叶子节点来找到对应的值。同时 B+ 树所有查询都要查找到叶子节点,查询性能比 B-树稳定。

8、数据库索引

数据库以 B 树或者 B+ 树格式来储存的数据的,一张表是根据主键来构建的树的结构。因此如果想查找其他字段,就需要建立索引,我对于索引的理解是它就是以某个字段为关键字的 B 树文件,通过这个 B 树文件就能够提高数据查找的效率。但是由于我们需要维护的是平衡树的结构,因此对于数据的写入、修改、删除就会变慢,因为这有可能会涉及到树的平衡调整。

9、红黑树

红黑树
红黑树是一种自平衡的二叉查找树,它主要是为了解决不平衡的二叉查找树的查找效率不高的缺点。红黑树保证了从根到叶子节点的最长路径不会超过最短路径的两倍。

红黑树的具体规则:

1、节点是红色或黑色。
2.根节点是黑色。

3.每个叶子节点都是黑色的空节点(NIL 节点)。

4.每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)。

5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

6.当红黑树发生删除和插入导致红黑树不满足这些规则时,需要通过处理,使其重新满足这些规则。

10、Huffman树

给定 n 权值作为 n 个叶子节点,构造一棵二叉树,若这棵二叉树的带权路径长度达到最小,则称这样的二叉树为最优二叉树,也称为 Huffman 树。

利用 Huffman 树对每一个字符编码,该编码又称为 Huffman 编码,Huffman 编码是一种前缀编码,即一个字符的编码不是另一个字符编码的前缀。

性质:

1.对应一组权重构造出来的 Huffman 树一般不是唯一的。

2.Huffman 树具有最小的带权路径长度。

3.Huffman 树中没有度为 1 的结点。

4.哈夫曼树是带权路径长度最短的树,路径上权值较大的结点离根较近。

5.Huffman 树的带权路径长度 WPL 等于各叶子结点的带权路径长度之和。

二叉查找树
二叉查找树是一种特殊的二叉树,相对于较小的值保存在左节点中,较大的值保存在右节点中,这一特性使得查找的效率很高,对于数值型和非数值型数据,比如字母和字符串,都是如此。

实现树的节点插入方法:
节点差诶的基本上想是将插入节点和当前节点比较,如果当前节点值比较小,并且没有左子树。那么将节点作为左子节点,否则继续和左子树进行比较,如果比当前节点值大,并且没有右子树,则将节点作为右叶子节点,否则继续和右子树进行比较。循环这个过程直到找到合适的插入位置。

参考链接:
算法总结
漫画算法

平衡二叉树,AVL树之图解篇

以上是关于JavaScript树的数据结构基础概念及特点(非常全)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL运维基础知识面试问答题

数据结构复习笔记——树的基本概念及结构

mysql 面试题库大全

第五十一课 NoSQL基础概念及MongoDB应用数据库分配概念

二叉树,堆详解

数据结构(12)_树的概念及通用树的实现