目录

一.树的基本术语

二.二叉树

  2.1 二叉树的定义

  2.2 满二叉树与完全二叉树

三.二叉排序树

四.平衡二叉树

五.B-树

六.B+树

七.红黑树

 

 

 

一.树的基本术语

  介绍术语的时候,结合下面这幅图进行解释:

   

  1. 结点:树中的一个独立单元。包含一个数据元素及若于指向其子树的分支,如图中的A、B、C、D等。
  2. 结点的度:结点拥有的子树数称为结点的度。例如,A的度为3,C的度为1,F的度为0。
  3. 树的度:树的度是树内各结点度的最大值。图所示的树的度为3。
  4. 叶子:度为0的结点称为叶子或终端结点。结点K、L、F、G、M、I、J都是树的叶子。
  5. 非终端结点:度不为0的结点称为非终端结点或分支结点。除根结点之外,非终端结点也称为内部结点。
  6. 双亲和孩子:结点的子树的根称为该结点的孩子,相应地,该结点称为孩子的双亲。例如,B的双亲为A,B的孩子有E和F。
  7. 兄弟:同一个双亲的孩子之间互称兄弟。例如,H、I和J互为兄弟。
  8. 祖先:从根到该结点所经分支上的所有结点。例如,M的祖先为A、D和H。
  9. 子孙:以某结点为根的子树中的任一结点都称为该结点的子孙。如B的子孙为E、K、L和F。
  10. 层次:结点的层次从根开始定义起,根为第一层,根的孩子为第二层。树中任一结点的层次等千其双亲结点的层次加1。
  11. 堂兄弟:双亲在同一层的结点互为堂兄弟。例如,结点G与E、F、H、I、J互为堂兄弟。
  12. 树的深度:树中结点的最大层次称为树的深度或高度。图所示的树的深度为4。
  13. 有序树和无序树:如果将树中结点的各子树看成从左至右是有次序的(即不能互换),则称该树为有序树,否则称为无序树。在有序树中最左边的子树的根称为第一个孩子,最右边的称为最后一个孩子。
  14. 森林:是m(m≥O)棵互不相交的树的集合。对树中每个结点而言,其子树的集合即为森林。由此,也可以用森林和树相互递归的定义来描述树。

 

二.二叉树

2.1 二叉树的定义

  二叉树(BinaryTree)是n(n≥O)个结点所构成的集合,它或者为空树(n=0);或者为非空树,

  对于非空树T:

  1.有且仅有一个称之为根的节点;

  2.除根结点以外的其余结点分为两个互不相交的子集T1和T2, 分别称为T的左子树和右子树,且T1和T2本身又都是二叉树。

  二叉树与树一样具有递归性质,二叉树与树的区别主要有以下两点:

  1.二叉树每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点);

  2.二叉树的子树有左右之分,其次序不能任意颠倒。

 

2.2 满二叉树与完全二叉树

  

 

三.二叉排序树

  二叉排序树(Binary Sort Tree)又称二叉查找树,它是一种对排序和查找都很有用的特殊二叉树。

  二叉排序树的定义:

    1.二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:

    2.若它的左子树不空,则左子树上所有结点的值均小千它的根结点的值;

    3.若它的右子树不空,则右子树上所有结点的值均大千它的根结点的值;

    4.它的左、右子树也分别为二叉排序树。

  二叉排序树是递归定义的。由定义可以得出二叉排序树的一个重要性质:中序遍历一棵二叉排序树时可以得到一个结点值递增的有序序列。

  

 

四.平衡二叉树

  二叉排序树查找算法的性能取决于二叉树的结构,而二叉排序树的形状则取决于其数据集。

  如果数据呈有序排列,则二叉排序树是线性的,查找的时间复杂度为O(n); 反之,如果二叉排序 树的结构合理,则查找速度较快,查找的时间复杂度为O(log2 n)事实上,树的高度越小,查找速度越快。因此,希望二叉树的高度尽可能小。

  平衡二叉树(Balanced Binary Tree或Height-Balanced Tree),它是一种特殊的二叉排序树,因由前苏联数学家Adelson-Velskii和Landis提出,所以又称AVL树。

  平衡二叉树或者是空树,或者是具有如下特征的二叉排序树:

  1.左子树和右子树的深度之差的绝对值不超过1;

  2.左子树和右子树也是平衡二叉树;

  3.若将二叉树上结点的平衡因子(Balance Factor,BF)定义为该结点左子树和右子树的深度之差,则平衡二叉树上所有结点的平衡因子只可能是-1、0和1;只要二叉树上有一个结点的平衡 因子的绝对值大于1 , 则该二叉树就是不平衡的。

  下图结点中的值为该结点的平衡因子

  

  每次插入和删除平衡二叉树的节点后,都可能导致平衡二叉树失去平衡,就需要旋转调平。

 

五.B-树

  线性表的查找(包括顺序查找、二分查找、分块查找)、二叉搜索树、平衡二叉树,这几种查找方式都适用于存储在计算机内存中较小的文件,不适用文件比较大且存放于外存的查找,这些查找方式称为“内查找”。

  B-树(也成B树),用于外查找的平衡多叉树,磁盘管理系统中的目录管理,以及数据库系统中的索引组织(比如MySQL的MyISAM存储引擎就是使用B-树)。

  B树的定义:一棵m阶的B-树,或为空树,或为满足下列特性的m叉树: 

  1.树中每个结点至多有m棵子树,也就是说,每个节点的关键字个数最多为m-1个。

  2.若根结点不是叶子结点,则至少有两棵子树;

  3.除根之外的所有非终端结点至少有m/2棵子树;

  4.所有的叶子结点都出现在同一层次上,并且不带信息,通常称为失败结点(失败结点并不存在,指向这些结点的指针为空。

  5.所有的非终端结点最多有m-1个关键字。

  B-树结点的结构如下图所示:

  

  下面是利用上面的B树节点结构,构造了一个4阶的B树(m=4,每个节点最多有3个关键字),如下图所示:

  

  关于B树定义中的一些注意点:

  1.m阶,这个m不是指树的层级,而是指每个节点最多能有m个子节点(最多有m-1个关键字)。

  2.引入失败结点是为了便于分析B-树的查找性能,比如上面的叶子节点d,包含1个关键字为11,关键字11的左右分别为指向子节点的指针,现在如果要查询值为10的关键字,发现d节点的关键字为11,那么继续查找d节点的左孩子,发现指向左孩子的指针指向F(failure),表示查找失败,没有关键字为10的数据。

  3.按照B树的定义,3阶B树的所有非叶子结点最多可以有2个关键字(此时有3个子树),最少有一个关键字(此时有2个子树),所以3阶B树又称为2-3树;同理,4阶B树又可称为2-4树。 

  一般情况下,描述一个B树时,会省略关键字的个数,主要突出关键字,然后用指针连接子节点,比如下面这样

  

  上面的图中,最下面一层的空块也就是叶子节点(F节点、失败节点),叶子不包含任何信息。

 

六.B+树

  B+树是B-树的一种变形,更适合做文件索引系统,比如MySQL的InnoDB的索引底层就是使用B+树。

  B+树的定义:

  1.有n个子树的节点中含有n个关键字;

  2.所有的叶子节点中包含了全部的关键字信息,以及指向含这些关键字记录的指针,且叶子节点本身按照关键字的大小自小到大顺序连接;

  3.所有的非叶子节点可以看成索引的一部分,节点中仅含有其子树(根节点)中的最大或者最小的关键字;

  从上面的定义中,可以与B-树进行对比:B-树是有n个子树的节点中包含n-1个关键字;B-树的叶子节点是失败节点(F节点),不包含任何信息。

  下面是一个3阶的B+树:

   

  上图中,叶子节点包含所有的关键字,按照顺序遍历叶子节点,分别是:5,10,15,20,25,28,30,50,55,60,65,75,80,85,90,95,是按照从小到大排序的。

  可以通过B+树的叶子节点直接访问其他叶子节点,而不需要返回根节点(在B-树中,如果要通过一个叶子节点访问其他叶子节点,则需要返回上一层或者根节点)。

 

七.红黑树 

  AVL树的插入和删除节点都可能涉及到平衡调整,因为AVL是严格平衡的,所以当进行删除和插入节点的时候,进行调整平衡是比较费时的,另外AVL树的每个节点都会记录左右子树的高度差,如果高度差的绝对值超过1,则需要进行调平,保存高度差的整型变量也会占用内存。

  红黑树(Red Black Tree) 是一种自平衡二叉查找树,红黑树降低了平衡性要求,达到局部平衡。

  红黑树中的节点使用“红”和“黑”进行着色(也就是用一个bool值表示红或黑,比如true为红,false为黑),红黑树并不是严格的平衡二叉树

 

  红黑树的性质:

  1.红黑树的每个节点,要么是红色,要么是黑色;

  2.根节点永远是黑色;

  3.“红色”节点的两个子节点必须是黑色的,也就是“不允许出现两个连续的红色节点”,但是可以出现连续的黑色节点;

  4.对于每个节点,从该节点到其所有子孙叶节点的路径中,所包含的黑色节点数量必须相同;

 

  5.扩充外部叶节点都是黑色节点(扩充外部叶节点也就是叶子节点的左右子节点,虽然叶子节点的左右节点都为null,但是红黑树认为叶子节点的左右节点都为黑节点);

  在最坏条件下,红黑树也能在O(log n)的时间内做查找、删除、插入操作,n是指树中的元素个数。

 

  红黑树与AVL树的区别:

  1.AVL(平衡二叉树)的查询性能更高,因为AVL比红黑树更加严格平衡(AVL调平的频次较高);

  2.红黑树的插入和删除的速度更快,因为调整的频次较低,甚至不需要调整;

  3.AVL需要在每个节点增加一个整数来记录左右子树的高度差;而红黑树的每个节点只需要使用一个布尔值标志其实red or black。

 

版权声明:本文为-beyond原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/-beyond/p/8926314.html