树的总结

(一)二叉树

  相关复杂度:高度为k的二叉树最多有2^k-1,因此如果二叉排序树是平衡的,则n个节点的二叉排序树的高度为log2n+1,其查找效率为O(log2n),近似于折半查找。如果二叉排序树完全不平衡,则其深度可达到n,查找效率为O(n),退化为顺序查找。一般的,二叉排序树的查找性能在O(Log2n)到O(n)之间。(对于二叉排序树,高度决定了查找效率)

 1.二叉查找树(BST树)

(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
      对于一般的二叉搜索树(Binary Search Tree),其期望高度(即为一棵平衡树时)为log2n,其各操作的时间复杂度O(log2 n),最坏的情况为其操作的时间复杂度将退化成线性的,即O(n)。

 2.平衡二叉查找树(AVL树)

(1)本身首先是一棵二叉搜索树。
(2)带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。
最少节点数n 如以斐波那契数列可以用数学归纳法证明:
N(0) = 1 (表示 AVL Tree 高度为0的节点总数)
N(1) = 2(表示 AVL Tree 高度为1的节点总数)
N(2) = 4(表示 AVL Tree 高度为2的节点总数)
N(h)=N(h− 1) +N(h− 2) + 1 (表示 AVL Tree 高度为h的节点总数)
节点的平衡因子是它的左子树的高度减去它的右子树的高度。带有平衡因子 1、0 或 -1 的节点被认为是平衡的。带有平衡因子 -2 或 2 的节点被认为是不平衡的,并需要重新平衡这个树。平衡因子可以直接存储在每个节点中,或从可能存储在节点中的子树高度计算出来。
n个结点的AVL树最大深度约1.44log2n。查找、插入和删除在平均和最坏情况下都是O(logn)插入和删除可能需要通过一次或多次树旋转来重新平衡这个树这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。
  1. 左左插入——左旋
  2. 右右插入——右旋
  3. 左右插入——左右旋
  4. 右左插入——右左旋
3.红黑树

除了二叉查找树的一般要求外,还包括了:

1.节点是红色或黑色。

2.根节点是黑色。

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

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

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

这些性质保证了根节点到任意叶子节点的路径长度,最多相差一半(因为路径上的黑色节点相等,差别只是不能相邻的红色节点个数)

红黑树都既是二叉查找树,也是2-3典型的用途是实现关联数组

红黑树背后的思想是用标准的二叉查找树(完全由2-结点构成)和一些额外的信息(替换3-结点)来表示2-3树。

我们将树中的链接分为两种类型:红链接将两个2-结点连接起来构成一个3-结点,黑链接则是2-3树中的普通链接。确切地说,我们将3-结点表示为由一条左斜的红色链接相连的两个2-结点


  

因为每个结点都只会有一条指向自己的链接(从它的父结点指向它),我们将链接的颜色保存在表示结点的Node数据类型的布尔变量color中(若指向它的链接是红色的,那么该变量为true,黑色则为false)。

当我们提到一个结点颜色时,我们指的是指向该结点的链接的颜色。

红黑树能够以O(log2n)的时间复杂度进行搜索、插入、删除操作。红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高。红黑树并不追求“完全平衡”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。红黑树通过两种手段来实现平衡:改变节点颜色和执行旋转操作。

AVL树和红黑树都是用旋转保持平衡,AVL树对每个插入操作最多需要两次次旋转(单/双旋),对每个删除操作最多需要O(logn)次旋转;而红黑树对每个插入和删除操作,任何不平衡都会在三次旋转之内解决。

  1. 如果插入一个node引起了树的不平衡,AVL和RB-Tree都是最多只需要2次旋转操作,即两者都是O(1);但是在删除node引起树的不平衡时,最坏情况下,AVL需要维护从被删node到root这条路径上所有node的平衡性,因此需要旋转的量级O(logN),而RB-Tree最多只需3次旋转,只需要O(1)的复杂度。

  2. 其次,AVL的结构相较RB-Tree来说更为平衡,在插入和删除node更容易引起Tree的unbalance,因此在大量数据需要插入或者删除时,AVL需要rebalance的频率会更高。因此,RB-Tree在需要大量插入和删除node的场景下,效率更高。自然,由于AVL高度平衡,因此AVL的search效率更高。

  3. map的实现只是折衷了两者在search、insert以及delete下的效率。总体来说,RB-tree的统计性能是高于AVL的。

  4. 因此AVL树适用于查找多,删除调整少的情况。综合性能看红黑树是一种比较折中的选择。

参考链接:https://blog.csdn.net/yang_yulei/article/details/26066409

http://www.sohu.com/a/201923614_466939

https://www.cnblogs.com/nullzx/p/6128416.html(对理解性质有帮助)

https://blog.csdn.net/sun_tttt/article/details/65445754

https://blog.csdn.net/gao1440156051/article/details/51581394(红黑树常见面试题)


(二)平衡树(多路)

 B树,B+树,B*树,2-3树

AVL树和红黑树适合内部存储应用,B树适合外部存储应用,主要应用于数据库的索引

参考链接:https://www.cnblogs.com/maybe2030/p/4732377.html#_label5

(三)树的应用场景

AVL树:windows对进程地址空间的管理

红黑树:广泛应用与C++STL中,如map和set都是用红黑树实现的

B/B+树:用在磁盘文件组织,数据索引和数据库的索引


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值