Swift 数据结构 - 红黑树(Red-Black Tree)

1. 什么是红黑树

红黑树 本质上是一种 二叉查找树,但它在二叉查找树的基础上额外添加了一个 标记(颜色),可以是红或黑(非红即黑),同时具有一定的 规则。这些规则使红黑树保证了一种平衡,插入、删除、查找 的最坏时间复杂度都为 O(logn)

1.1 红黑树的 5 个特性

image.png

红黑树在原有的二叉查找树基础上增加了如下几个要求:

  1. Every node is either red or black.
  2. The root is black.
  3. Every leaf (NIL) is black.
  4. If a node is red, then both its children are black.
  5. For each node, all simple paths from the node to descendant leaves contain the same number of black nodes.

中文意思是:

  1. 每个节点要么是红色,要么是黑色;
  2. 根节点永远是黑色的;
  3. 所有的叶节点都是是黑色的(注意这里说叶子节点其实是上图中的 NIL 节点);
  4. 每个红色节点的两个子节点一定都是黑色;
  5. 从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点;

五条性质,合起来,来句顺口溜就是:(1)红黑 (2)黑 (3)黑 (4&5)红->黑 黑

注意:性质(5)保证红黑树的最长路径不超过最短路径的两倍。

2. 红黑树与平衡二叉树的区别?

2.1 AVL树(平衡二叉树)

(1) 简介
AVL 树是带有平衡条件的二叉查找树,一般是用平衡因子差值判断是否平衡并通过旋转来实现平衡,左右子树高度差不超过1,和红黑树相比,AVL树是严格的平衡二叉树,平衡条件必须满足(所有结点的左右子树高度差不超过1)。不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保存平衡,而因为旋转非常耗时,由此我们可以知道 AVL树适合用于插入与删除次数比较少,但查找多的情况。

(2)局限性
由于维护这种高度平衡所付出的代价比从中获得的效率收益还大,故而实际的应用不多,更多的地方是用追求局部而不是非常严格整体平衡的红黑树。当然,如果应用场景中对插入删除不频繁,只是对查找要求较高,那么AVL还是较优于红黑树。

(3)应用
1.Windows NI内核中广泛存在;

2.2 红黑树

(1) 简介
一种二叉查找树,但在每个节点增加一个存储位表示结点的颜色,可以是红或黑(非红即黑)。通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因此,红黑树是一中弱平衡二叉树(由于是弱平衡,可以看到,在相同的节点情况下,AVL树的高度低于红黑树),相对于要求严格的AVL树来说,它的旋转次数少,插入最多两次旋转,删除最多三次旋转,所以对于搜索,插入,删除操作较多的情况下,我们就用红黑树
(2)应用
广泛用在C++的 STL 中。如 MapSet 都是用红黑树实现的

你可能感兴趣的:(Swift 数据结构 - 红黑树(Red-Black Tree))