数据结构中的各类树浅谈

数据结构中为了存储和查找的方便,用各类树结构来存储文件,本章就浅谈一下各类树的表示方法、特色及各自的用途,本章设计的树结构包括:二叉查找树(二叉排序树)、平衡二叉树(AVL树)、红黑树、B-树、B+树、字典树(trie树)、后缀树、广义后缀树。算法

一、二叉查找树(二叉排序树)数据结构

  (图a)搜索引擎

二叉查找树是一种动态查找表(图a),具备这些性质:                                 
(1)若它的左子树不为空,则左子树上的全部节点的值都小于它的根节点的值;
(2)若它的右子树不为空,则右子树上全部节点的值都大于它的根节点的值;
(3)其余的左右子树也分别为二叉查找树;
(4)二叉查找树是动态查找表,在查找的过程当中可见添加和删除相应的元素,在这些操做中须要保持二叉查找树的以上性质。设计

二、平衡二叉树(AVL树)指针

(图b)blog

  含有相同节点的二叉查找树能够有不一样的形态,而二叉查找树的平均查找长度与树的深度有关,因此须要找出一个查找平均长度最小的一棵,那就是平衡二叉树(图b),具备如下性质:
(1)要么是棵空树,要么其根节点左右子树的深度之差的绝对值不超过1;
(2)其左右子树也都是平衡二叉树;
(3)二叉树节点的平衡因子定义为该节点的左子树的深度减去右子树的深度。则平衡二叉树的全部节点的平衡因子只多是-1,0,1。排序

三、红黑树索引

  

(图c)字符串

  红黑树是一种自平衡二叉树,在平衡二叉树的基础上每一个节点又增长了一个颜色的属性,节点的颜色只能是红色或黑色。具备如下性质:
(1)根节点只能是黑色;
(2)红黑树中全部的叶子节点后面再接上左右两个空节点,这样能够保持算法的一致性,并且全部的空节点都是黑色;
(3)其余的节点要么是红色,要么是黑色,红色节点的父节点和左右孩子节点都是黑色,及黑红相间;
(4)在任何一棵子树中,从根节点向下走到空节点的路径上所通过的黑节点的数目相同,从而保证了是一个平衡二叉树。效率

四、B-树

(图d)

  B-树是一种平衡多路查找树,它在文件系统中颇有用。一棵m阶B-树(图d为4阶B-树),具备下列性质:
(1)树中每一个节点至多有m棵子树;
(2)若根节点不是叶子节点,则至少有2棵子树;
(3)除根节点以外的全部非终端节点至少有棵子树;
(4)每一个节点中的信息结构为(A0,K1,A1,K2......Kn,An),其中n表示关键字个数,Ki为关键字,Ai为指针;
(5)全部的叶子节点都出如今同一层次上,且不带任何信息,也是为了保持算法的一致性。

五、B+树

(图e)

  B+数是B-树的一种变形,它与B-树的差异在于(图e为3阶B+树):
(1)有n棵子树的节点含有n个关键字;
(2)全部的叶子节点包含了所有关键字的信息,及指向这些关键字记录的指针,且叶子节点自己按关键字大小自小到大顺序连接;
(3)全部非终端节点能够当作是索引部分,节点中仅含有其子树(根节点)中最大(或最小)关键字,全部B+树更像一个索引顺序表;
(4)对B+树进行查找运算,一是从最小关键字起进行顺序查找,二是从根节点开始,进行随机查找。

六、字典树(trie树)

(图f)

  字典树是一种以树形结构保存大量字符串。以便于字符串的统计和查找,常常被搜索引擎系统用于文本词频统计。它的优势是:利用字符串的公共前缀来节约存储空间,最大限度地减小无谓的字符串比较,查询效率比哈希表高。具备如下特色(图f):
(1)根节点为空;
(2)除根节点外,每一个节点包含一个字符;
(3)从根节点到某一节点,路径上通过的字符链接起来,为该节点对应的字符串。
(4)每一个字符串在创建字典树的过程当中都要加上一个区分的结束符,避免某个短字符串正好是某个长字符串的前缀而淹没。

七、后缀树

所谓后缀树,就是包含一则字符串全部后缀的压缩了的字典树。先说说后缀的定义。给定一长度为n的字符串S=S1S2..Si..Sn,和整数i,1 <= i <= n,子串SiSi+1...Sn都是字符串S的后缀。以字符串S=XMADAMYX为例,它的长度为8,因此S[1..8], S[2..8], ... , S[8..8]都算S的后缀,咱们通常还把空字串也算成后缀。这样,咱们一共有以下后缀。对于后缀S[i..n],咱们说这项后缀起始于i。

  1. S[1..8], XMADAMYX, 也就是字符串自己,起始位置为1
  2. S[2..8], MADAMYX,起始位置为2
  3. S[3..8], ADAMYX,起始位置为3
  4. S[4..8], DAMYX,起始位置为4
  5. S[5..8], AMYX,起始位置为5
  6. S[6..8], MYX,起始位置为6
  7. S[7..8], YX,起始位置为7
  8. S[8..8], X,起始位置为8
  9. 空字串。记为$。

全部这些后缀字符串组成一棵字典树:

仔细观察上图,咱们能够看到很多值得压缩的地方。好比蓝框标注的分支都是独苗,没有必要用单独的节点同边表示。若是咱们容许任意一条边里包含多个字母,就能够把这种没有分叉的路径压缩到一条边。另外每条边已经包含了足够的后缀信息,咱们就不用再给节点标注字符串信息了。咱们只须要在叶节点上标注上每项后缀的起始位置。因而咱们获得下图:

这样的结构丢失了某些后缀。好比后缀X在上图中消失了,由于它正好是字符串XMADAMYX的前缀。为了不这种状况,咱们也规定每项后缀不能是其它后缀的前缀。要解决这个问题其实挺简单,在待处理的子串后加一个空字串就好了。例如咱们处理XMADAMYX前,先把XMADAMYX变为 XMADAMYX$,因而就获得suffix tree。

这就造成一棵后缀树了。关于如何创建一棵后缀树,已有很成熟的算法,能在o(n)时间内解决。

八、广义后缀树

  广义后缀树是好几个字符串的的全部后缀组成的字典树,一样每一个字符串的全部后缀都具备一个相同的结束符,不一样字符串的结束符不一样。

传统的后缀树只能处理一个单词的全部后缀。广义后缀树存储任意多个单词的全部后缀。例如字符串“abab”和“baba”,首先将它们使用特殊结束符连接起来,如表示成“abab$baba#”,而后求链接后的新字符的后缀树,遍历所得后缀树,如遇到特殊字符,如“$”,"#"等则去掉以该节点为跟的子树,最后所得后缀树即为原字符串组的广义后缀树。其实质是将两个字符串的全部后缀,即:abab$,bab$,ab$,b$,baba#,aba#,ba#,a#,组成字典树,再进行压缩处理。广义后缀树的一个常应用就是判断两个字符串的相识度。

相关文章
相关标签/搜索