计算机科学中的树

数据结构参考网站:http://www.bccn.net/Article/kfyy/sjjg/
                                  http://sjjg.js.zwu.edu.cn/SFXX/index.html
计算机科学中的树
 

二叉查找树(二叉排序树,二叉搜索树)

---------------------------------------------------------------------------------------------------------------

二叉查找树或者是一棵空树;或者是具有下列性质的二叉树:

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3)左、右子树也分别为二叉查找树;

 

平衡二叉树(Balanced Binary Tree)又被称为AVL树(区别于AVL算法,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。构造与调整方法平衡二叉树的常用算法有红黑树、AVL、Treap、伸展树等。

 

 

 

 

堆(二叉堆)

---------------------------------------------------------------------------------------------------------------

堆是一种完全二叉树,效率很高,常用的排序算法、Dijkstra算法、Prim算法等都要用堆(优先级队列)优化。一般的二叉堆不能进行有效查找和堆之间的合并。

(插入,获得及删除最小值)

 

可并堆

可以在O(logN)时间内完成两个堆的合并操作的二叉堆。如左偏堆,二项堆,斐波那契堆。

 

最优二叉树(哈夫曼树)

-----------------------------------------------------------------------------------------------------------------

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

 

字典树

----------------------------------------------------------------------------------------------------------------

又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。

 

AVL树

-------------------------------------------------------------------------------------------------------------------

是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个儿子子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。

 

伸展树

-----------------------------------------------------------------------------------------------------------------

伸展树(Splay Tree)是一种二叉排序树,它能在O(log n)内完成插入、查找和删除操作。它由Daniel Sleator和Robert Tarjan创造。它的优势在于不需要记录用于平衡树的冗余信息。在伸展树上的一般操作都基于伸展操作。假设想要对一个二叉查找树执行一系列的查找操作。为了使整个查找时间更小,被查频率高的那些条目就应当经常处于靠近树根的位置。于是想到设计一个简单方法,在每次查找之后对树进行重构,把被查找的条目搬移到离树根近一些的地方。splay tree应运而生。splay tree是一种自调整形式的二叉查找树,它会沿着从某个节点到树根之间的路径,通过一系列的旋转把这个节点搬移到树根去。
 

 

Treap

-----------------------------------------------------------------------------------------------------------------

Treap=Tree+Heap,Treap是一棵二叉排序树,它的左子树和右子树分别是一个Treap,和一般的二叉排序树不同的是,Treap纪录一个额外的数据,就是优先级。Treap在以关键码构成二叉排序树的同时,还满足堆的性质(在这里我们假设节点的优先级大于该节点的孩子的优先级)。但是这里要注意的是Treap和二叉堆有一点不同,就是二叉堆必须是完全二叉树,而Treap可以并不一定是。Treap维护堆性质的方法用到了旋转,这里先简单地介绍一下。Treap只需要两种旋转,这样编程复杂度比Splay等就要小一些,这正是Treap的特色之一。

 

红黑树

------------------------------------------------------------------------------------------------------------------

红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

性质1.节点是红色或黑色。

性质2.根节点是黑色。

性质3.每个叶节点是黑色的。

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

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

 

B树

-------------------------------------------------------------------------------------------------------------------

在B-树中查找给定关键字的方法是,首先把根结点取来,在根结点所包含的关键字K1,…,kj查找给定的关键字(可用顺序查找或二分查找法),若找到等于给定值的关键字,则查找成功;否则,一定可以确定要查的关键字在某个Ki或Ki+1之间,于是取Pi所指的结点继续查找,直到找到,或指针Pi为空时查找失败。

 

SBT

-----------------------------------------------------------------------------------------------------------------

Size Balanced Tree(简称SBT)是一自平衡二叉查找树,是在计算机科学中用到的一种数据结构。它是由中国广东中山纪念中学的陈启峰发明的。陈启峰于2006年底完成论文《Size Balanced Tree》,并在2007年的全国青少年信息学奥林匹克竞赛冬令营中发表。由于SBT的拼写很容易找到中文谐音,它常被中国的信息学竞赛选手和ACM/ICPC选手们戏称为“傻B树”、“Super BT”等。相比红黑树、AVL树等自平衡二叉查找树,SBT更易于实现。据陈启峰在论文中称,SBT是“目前为止速度最快的高级二叉搜索树”。SBT能在O(log n)的时间内完成所有二叉搜索树(BST)的相关操作,而与普通二叉搜索树相比,SBT仅仅加入了简洁的核心操作Maintain。由于SBT赖以保持平衡的是size域而不是其他“无用”的域,它可以很方便地实现动态顺序统计中的select和rank操作。

 

区间树

------------------------------------------------------------------------------------------------------------------

区间树是在红黑树基础上进行扩展得到的支持以区间为元素的动态集合的操作,其中每个节点的关键值是区间的左端点。通过建立这种特定的结构,可是使区间的元素的查找和插入都可以在O(lgn)的时间内完成。相比于基础的数据结构,增加了一个max[x],即以x为根的子树中所有区间的断点的最大值。

 

线段树

-------------------------------------------------------------------------------------------------------------------

线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2,b]。因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区间的长度。使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的空间复杂度为2N,因此有时需要离散化让空间压缩。

线段树至少支持下列操作:

Insert(t,x):将包含区间 int 的元素 x 插入到树t中;

Delete(t,x):从线段树 t 中删除元素 x;

Search(t,i):返回一个指向树 t 中元素 x 的指针。

 

点树

-----------------------------------------------------------------------------------------------------------------

线段树能够在log(MaxLen)时间内完成线段的添加、删除、查询等操作。但一般的实现都有点复杂。而线段树应用中有一种是专门针对点的,即点树,它的实现却非常简单。其实现原理很简单:每当增加(或删除)一个大小为X的点时,就在树上添加(或删除)一条(X,MaxLen)的线段(不含端点),当要查询一个点的排名时,只要看看其上有多少条线段就可以了。

 

胜者树

-------------------------------------------------------------------------------------------------------------------

胜者树和败者树都是完全二叉树,是树形选择排序的一种变型。每个叶子结点相当于一个选手,每个中间结点相当于一场比赛,每一层相当于一轮比赛。不同的是,胜者树的中间结点记录的是胜者的标号;而败者树的中间结点记录的败者的标号。胜者树与败者树可以在log(n)的时间内找到最值。任何一个叶子结点的值改变后,利用中间结点的信息,还是能够快速地找到最值。在k路归并排序中经常用到。

 

败者树

------------------------------------------------------------------------------------------------------------------

败者树是胜者树的一种变体。在败者树中,用父结点记录其左右子结点进行比赛的败者,而让胜者参加下一轮的比赛。败者树的根结点记录的是败者,需要加一个结点来记录整个比赛的胜利者。采用败者树可以简化重构的过程。

 

笛卡尔树

----------------------------------------------------------------------------------------------------------------
笛卡尔树是一棵二叉树,树的每个节点有两个值,一个为key,一个为value。光看key的话,笛卡尔树是一棵二叉搜索树,每个节点的左子树的key都比它小,右子树都比它大;光看value的话,笛卡尔树有点类似堆,根节点的value是最小(或者最大)的,每个节点的value都比它的子树要大。笛卡尔树和Treap结构不是类似,而是一模一样,但是两者的用途和用法不一样。笛卡尔树是把已有的一些(key, value)二元组拿来构造树,然后利用构树过程和构好的树来解决问题。而Treap的目的只是对一些key进行二叉搜索,但是为了保证树的平衡性,为每个key随机地额外增加了一个value(或者叫权重)属性,这样从概率上来讲可以让这棵树更加平衡。理解的两者的关系和区别后,什么时候该用什么结构就一目了然了。

 

左偏树

------------------------------------------------------------------------------------------------------------------

左偏树(Leftist Tree),或者叫左倾树,左式树,左式堆(Leftist Heap),左堆。顾名思义,它好象是向左偏的,实际上它是一种趋于非常不平衡的二叉树结构,但却能够实现对数级的合并时间复杂度。

左偏树是一棵二叉树,每个节点具有四个属性:左子树(left),右子树(right),键值(key),零路径长(npl)。其中节点i的零路径长的定义为从i到i子树中最近的没有两非空个子节点的节点的路径的长度。空节点的零路径长为为-1,只有一个非空子节点的节点的零路径长为0。左偏树的节点之间除了满足堆序以外,还应满足节点左子节点的零路径长不小于右子节点的零路径长。

 

斜堆

-------------------------------------------------------------------------------------------------------------------

是左偏树的自调节形式,实现起来极其简单。斜堆和左偏树的关系类似伸展树和AVL树间的关系。

 

二项堆

-----------------------------------------------------------------------------------------------------------------

二项树是一种通过递归定义的有序树,可以由以下定义得到:
1,度数为0的二项树只包含一个结点
2,度数为k的二项树有一个根结点,根结点下有k个子女,每个子女分别是度数为k − 1,k − 2,...,2,1,0的二项树的根

 

斐波那契堆

------------------------------------------------------------------------------------------------------------------

斐波那契堆的特点:不涉及删除元素的操作有O(1)的平摊时间。 Extract-Min和Delete的数目和其它相比较小时效率更佳。用途:稠密图每次Decrease-key只要O(1)的平摊时间,和二项堆的O(lgn)相比是巨大的改进。斐波那契堆的结构较二项堆更松散。因此对结构的维护可以到方便时再做。斐波那契堆中的树是有根而无序的。每个节点包含一个指向其父节点的指针p[x],以及一个指向其任一子女的指针child[x](指向子女双链表)。

 

双堆

------------------------------------------------------------------------------------------------------------------

双堆是一棵完全二叉树。该树或者为空,或者满足下列性质:
1 根结点不含元素。
2 左子树是最小堆。
3 右子树是最大堆。
4 若右子树不空,设i为左子树中的任意结点,j为右子树中的对应结点。若这样的j不存在,则令j为右子树中对应i的双亲的结点。
结点i中的key小于或等于结点j中的key。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值