概念
参考资料
操作
参考资料
分类
AVL树(Adelson-Velsky and Landis Tree)
基本思想
-
在AVL树中,任意节点对应的左右子树的最大高度差为1,也被称为高度平衡二叉树;
-
查找、插入、删除操作在平均和最坏情况下的时间复杂度都是O(logn),插入和删除元素需要通过一系列旋转来实现树的重新平衡;
基本操作
-
插入:
-
删除:
优缺点分析
参考资料
伸展树(Splay Tree)
基本思想
-
在一个二叉搜索树(BST,Binary Search Tree)中进行查找(Search)操作时,为了使整体的查询时间更小,被查找频率高的节点应该处于靠近树根的位置;
-
在每次查找操作后,将被查找节点通过一系列旋转搬移到离树根近的地方;
基本操作
优缺点分析
-
优点:
-
效率高:平均效率查找为O(logn),并且由于将频繁查找的节点移到靠近树根的位置,其查找效率通常更高;
-
无需额外内存:无需记录额外的信息来维护树结构;
-
-
缺点:
-
最坏情况效率差:当以非递减顺序存储全部节点后,伸展树会退化成链表,时间复杂度为O(n);
-
实际运用成本高:即使仅用于查找,由于在查找过程中树的结构会发生变化,如果是多线程查找,需要额外的维护成本;
-
参考资料
树堆(Treap)
基本思想
-
Treap(Tree + Heap)和一般二叉查找树不同,Treap为每个节点记录优先级,在以value构建二叉查找树的同时,其节点优先级还满足堆的性质;
-
Treap其本身是一个二叉查找树,其左右子树也分别时一个Treap;
基本操作
-
查找:
-
时间复杂度:O(logn);
-
-
插入:
-
做法:给待插入节点随机分配一个优先级,先根据value将节点插入到二叉查找树中。然后通过旋转维护优先级次序,如果当前节点的优先级比根节点大就旋转,如果当前节点是根的左子节点就右旋,是右子节点就左旋;
-
时间复杂度:O(logn),旋转操作的时间复杂度为O(1),旋转次数最多为O(logn)次(树的高度);
-
-
删除:
-
思路:将待删除节点旋转到叶节点上,然后直接删除即可;
-
做法:寻找当前节点优先级最大的子节点,想与其相反的方向旋转,直到待删除节点被旋转到叶节点上,然后直接删除即可;
-
时间复杂度:O(logn),旋转次数最多O(logn)次;
-
优缺点分析
参考资料
红黑树(Red Black Tree)
背景
2-3树实现难度大(需要维护两种类型的节点,插入删除节点时需要考虑多种情况),AVL树综合性能差(插入删除节点时可能需要大量的旋转操作来重新恢复平衡),所以需要一种实现相对容易,并且综合性能优异的树结构。
定义
(1)节点是要么红色或要么是黑色。
(2)根一定是黑色节点。
(3)每个叶子节点都带有两个空的黑色节点(称之为NIL节点,它又被称为黑哨兵)。
(4)每个红色节点的两个子节点都是黑色(或者说从每个叶子到根的所有路径上不能有两个连续的红色节点)。
(5)从任一节点到它所能到达得叶子节点的所有简单路径都包含相同数目的黑色节点。
特性
-
根节点到任意叶子节点的路径长度,最多相差一半。(若树存在最短路径,则最短路径上均为黑色节点,那么第五条性质保证根节点到达最长路径与最短路径所包含的黑色节点数目相同,若最短路径长为N,则最长路径M=N+红色节点数目,性质4要求红色节点必定不连续,因此红色节点数目最多为N,则最长路径与最短路径最多相差N。);
-
如果一棵树满足红黑树,把红色节点收缩到其父节点,就变成了2-3-4树,所有红色节点都与其父节点构成3或4节点,其它节点为2节点。一颗红黑树对应唯一形态的2-3-4树,但是一颗2-3-4树可以对应多种形态的红黑树(主要是3节点可以对应两种不同的红黑树形态);
-
红色节点相当于2-3树中的3-节点(2-3-4树中的4-节点);
基本操作
-
查找
-
插入
-
删除
优缺点分析
-
优点
-
与AVL树相比,整体性能更优(红黑树插入时不平衡,最多需要2次旋转,删除时不平衡,最多需要3次旋转);
-
与2-3树相比,实现更为简单(2-3树需要维护2-节点和3-节点两种不同类型的节点,而红黑树中只有2-节点);
-
-
缺点
-
与AVL树相比,实现复杂(插入删除节点时,需要考虑多种不同情况)
-