各种树总结

二叉查找树(BST)

二叉查找树又叫二叉搜索树、二叉排序树,特点如下:

  1. 左子树上所有结点值均小于根节点
  2. 右子树上所有结点均大于根节点
  3. 节点的左右子树又是一棵二叉查找树
  4. 二叉查找树中序遍历得到结果是递增排序的节点序列

查找

从根节点出发,沿一条路径朝叶子节点前进,查找过程中数据比较次数与树的形态密切相关。
当树中每个节点左右子树高度大致相同时,树高logN。则平均查找长度与logN成正比,查找的平均时间复杂度在O(logN)数量级上。
当先后插入的关键字有序时,BST退化为单支树结构,此时树高n,平均查找长度为(n+1)/2,查找的平均时间复杂度在O(N)数量级上。

插入

新节点插入到叶子节点上,完全不需要改变树中原有节点的组织结构,插入一个节点的代价与查找一个不存在的数据的代价完全相同。

删除

当删除一个节点,需要定位到这个节点,这个过程需要一定的查找的代价,然后稍微改变一下树的形态。如果被删除节点的左右子树只有一个存在,则改变形态的代价仅为O(1),如果被删除节点的左右子树均存在,只需要将要删除节点的左孩子的右孩子的右孩子的。。。的右叶子节点与要删除节点互换,再改变一下左右子树即可,因此删除操作的时间复杂度不会超过O(logN)。
效率总结:
查找的最好时间复杂度为O(logN),最坏的时间复杂度为O(N)。
插入和删除操作算法简单,时间复杂度和查找差不多。

平衡二叉查找树

二叉查找树在最差情况下竟然和顺序查找效率相当,这是无法仍受的。事实也证明,当存储数据足够大的时候,树的结构对某些关键字的查找效率影响很大。当然,造成这种情况的主要原因就是BST不够平衡(左右子树高度差太大)。既然如此,那么我们就需要通过一定的算法,将不平衡树改变成平衡树。因此,AVL树就诞生了。

查找

AVL是严格平衡的BST(平衡因子不超过1)。那么查找过程与BST一样,只是AVL不会出现最差情况的BST(单支树)。因此查找效率最好,最坏情况都是O(logN)数量级的。

插入

AVL必须要保证严格平衡(|bf|<=1),那么每一次插入数据使得AVL中某些结点的平衡因子超过1就必须进行旋转操作。事实上,AVL的每一次插入结点操作最多只需要旋转1次(单旋转或双旋转)。因此,总体上插入操作的代价仍然在O(logN)级别上(插入结点需要首先查找插入的位置)。

删除

AVL删除结点的算法可以参见BST的删除结点,但是删除之后必须检查从删除结点开始到根结点路径上的所有结点的平衡因子。因此删除的代价稍微要大一些。每一次删除操作最多需要O(logN)次旋转。因此,删除操作的时间复杂度为O(logN)+O(logN)=O(2logN)。
AVL效率总结:
查找的时间复杂度维持在O(logN),不会出现最差情况
AVL树在执行每个插入操作时最多需要1次旋转,其时间复杂度在O(logN)左右。
AVL树在执行删除时代价稍大,执行每个删除操作的时间复杂度需要O(2logN)。

红黑树

二叉平衡树的严格平衡策略以牺牲建立查找结构(插入,删除操作)的代价,换来了稳定的O(logN) 的查找时间复杂度。但是这样做是否值得呢?
能不能找一种折中策略,即不牺牲太大的建立查找结构的代价,也能保证稳定高效的查找效率呢? 答案就是:红黑树。
特点:

  1. 每个节点只能是黑色或者是红色
  2. 根节点永远都是黑色的
  3. 每个叶子节点都是黑色的空节点
  4. 每个红色节点的两个子节点都是黑色的(从每个叶子节点到根的所有路径上不能有两个连续的红色节点)
  5. 从任一节点到每个叶子节点的所有路径都包含相同数目的黑色节点

查找

红黑树的性质:最长路径不超过最短路径长度的2倍,可以看出红黑树并不像AVL一样是严格平衡的,但是平衡性能要比BST好一些,查找代价基本维持在O(logN)左右,但是在最差的情况下(最长路径是最短路径的2倍少1),比AVL要逊色一些。

插入

红黑树插入节点的时候,需要旋转和变色操作,但是只需要保证基本平衡就可以了,因此插入节点最多只需要两次旋转,虽然变色操作需要O(logN),但是变色操作十分简单,代价很小。

删除

比AVL好很多,删除一个节点只需要3次旋转操作。
RBT效率总结:
查找 效率最好情况下时间复杂度为O(logN),但在最坏情况下比AVL要差一些,但也远远好于BST。
插入和删除操作改变树的平衡性的概率要远远小于AVL(RBT不是高度平衡的)。因此需要的旋转操作的可能性要小,而且一旦需要旋转,插入一个结点最多只需要旋转2次,删除最多只需要旋转3次(小于AVL的删除操作所需要的旋转次数)。虽然变色操作的时间复杂度在O(logN),但是实际上,这种操作由于简单所需要的代价很小。

B+&B-树

对于数据量非常大的查找操作,将数据全部放入内存组织成RBT结构是非常不实际的,需要在磁盘中建立好查找结构,在磁盘中组织查找结构,从任何一个节点指向其他节点都有可能读取一次磁盘数据,再将数据写入内存进行比较,频繁的磁盘IO操作效率是非常低下的,所有二叉树的查找结构在磁盘中都是低效的,B树很好的解决了整个问题。

B-

查找

平衡多路查找树(m-叉),B树的查找分为两种:(1)从一个节点查找另一个节点地址的时候,需要定位磁盘地址,查找代价极高。(2)将一个节点中有序关键字放入内存,进行优化查找(可以用折半),相比查找代价极低,而B树高度很小,B树比任何二叉结构查找树的效率都要高很多,而且B+树作为B树的变种,其查找效率更高。

插入

B-树的插入会发生节点的分裂,当插入操作引起s个节点的分裂时,磁盘访问次数为h(读取搜索路径上的节点)+2s(回写两个分裂出的新节点)+1(回写新的根节点或插入后没有导致分裂的节点),所以需要的磁盘访问次数是h+2s+1,最多可达3h+1,因此插入代价是很大的。

删除

B-树的删除会发生节点的合并,最坏情况下磁盘访问次数是3h=(找到包含被删除元素需要h次读访问)+(获取第2至h层的最相邻兄弟需要h-1次读访问)+(在第3至h层的合并需要h-2次写访问)+(对修改过的根节点和第2层的两个节点进行3次写访问)。
B-树效率总结:
由于考虑磁盘储存结构,B树的查找、删除、插入的代价都远远要小于任何二叉结构树(读写磁盘次数的降低)。

动态查找树的对比

平衡二叉树和红黑树

在这里插入图片描述

B+树和B-树

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值