平衡二叉排序树、AVL树、红黑树、B树、B+树

1、平衡二叉排序树 

    二叉查找树定义:又称为是二叉排序树(Binary Sort Tree)或二叉搜索树。二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:

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

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

  3) 左、右子树也分别为二叉排序树;

  4) 没有键值相等的节点。

      平衡二叉树定义:平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用算法有红黑树、AVL树等。在平衡二叉搜索树中,我们可以看到,其高度一般都良好地维持在O(log2n),大大降低了操作的时间复杂度。

       平衡二叉排序树兼具平衡二叉树与二叉排序树的特性。

2、AVL树

        AVL树是最先发明的自平衡二叉排序树。查找、插入和删除在平均和最坏情况下都是O(logn)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉排序树来说,时间上稳定了很多。

       红黑树和AVL树一样都对插入时间、删除时间和查找时间提供了最好可能的最坏情况担保。

红黑树的性质:

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

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

  性质2. 根是黑色。

  性质3. 所有叶子都是黑色(叶子是NIL节点)。

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

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

        这些约束确保了红黑树的关键特性: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。

3、红黑树与AVL树的区别

红黑树的高度问题
        棵拥有n个内部结点的红黑树的树高h<=2log(n+1)

红黑树的优点
         红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,而AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多。所以红黑树的插入效率更高!!!

与AVL树的比较
        红黑树要求从根节点到叶子节点的最长路径不大于最短路径的两倍
         AVL 树要求每一个子树的左右孩子节点高度差不超过1
         保持平衡的要求上面,AVL树要求大于RBtree, 也就带来了search, insert 和delete操作的性能差异

相同点
 
      插入、删除操作为了保持原来的性质,有可能要进行必要的调整,主要看调整的代价,时间复杂度;其中AVL树的调整频繁,代价大(要保持高度平衡),而RBtree 删除和插入的时间复杂度要好于AVL,
而对于search 操作而言,不涉及旋转调整操作,由于AVL树保持高度平衡,树的最大高度不超过1.44log(n), 而红黑树最大深度不超过 2log(n+2),
使用红黑树为何能比AVL树高效的原因
      从1这点来看红黑树是牺牲了严格的高度平衡的优越条件为代价红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作。
        此外,由于它的设计,任何不平衡都会在三次旋转之内解决。
        红黑树并不追求“完全平衡”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。
        所以红黑树的插入效率更高

主要是维持原有性质需要进行旋转的次数和时间复杂度

分析
如果插入一个node引起了不满足树的性质,比如改变了红黑树的性质,或者破坏了AVL树的平衡性质,AVL和RB-Tree 都是最多只需要两次2次旋转操作,即两者都是O(1), 但在删除节点的时候,最坏情况下,AVL树需要维护从被删除NODE到root 这条路径上面所有NODE的平衡性,因此平衡性为O(logN), 而RB-Tree 做多只需要三次旋转,只需要0(1) 的复杂度。

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

红黑树的应用领域
java 集合类和c ++ STL
典型的应用是关联数组,ava中的TreeSet,TreeMap,广泛用在C++的STL中。如map和set都是用红黑树实现的

Linux

你可能感兴趣的:(面试问题总结,java数据结构与算法)