浅析树结构(三)红黑树

浅析树结构之红黑树

首先先来了解一下红黑树的五个性质

  1. 每个结点非红即黑。
  2. 根结点是黑的。
  3. 每个叶结点(这里叶节点指的是NULL结点)都是黑的。
  4. 如果一个结点是红的,那么它的两个儿子都是黑的。
  5. 对于任意结点而言,其到树末端即NULL节点的每条路径都包含相同数目的黑结点。

等等等,一脸懵逼吧?? 那还是先来了解一下2-3树吧

2-3查找树

2-3树是一种树型数据结构,内部节点(存在子节点的节点)分为两种:
(1)2-节点, 有1个数据元素和2个孩子
(2)3-节点, 有2个数据元素和3个孩子

先来看一棵普通的2-3 查找树到底长什么样?

由上图可以知道, 对于2-3树中任意一个节点,左右子树的高度均相同,可见2-3树是一棵绝对平衡的树,所有空链接到根节点的距离都是相同的.

在一棵大小为N的2-3树中,查找和插入操作访问的结点必然不超过lgN个

2-3树的插入操作

2-3树(并不是二叉查找树)的插入操作与BST(二叉查找树)的插入操作有很大的区别, BST的插入操作是先进行一次未命中的查找,然后再将节点插入到对应的空链接上.如果2-3树也按照BST这样进行插入,就破坏了绝对平衡.它采用的方式是将新节点插入到已经存在的叶子节点中.

根据叶子节点的类型不同,插入的处理方式也有所变化:

  • 向2-节点中插入新键,直接将新节点合并到原来的节点上组成一个3-节点
  • 向一个父节点为2-节点的3-节点中插入新键(图中插入4), 这时会产生一个临时的4-节点, 需要将这个临时的4-节点分裂为3个2-节点,并将中间的2-节点上移与其父节点合并成一个3-节点.
  • 向一个父节点为3-节点的3-节点中插入新键,这时会产生一个临时的4-节点, 需要将这个临时的4-节点分裂为3个2-节点,并将中间的2-节点上移与其父节点合并成一个临时的4-节点, 继续分裂上移,直到不再存在临时的4-节点.

为何不直接使用2-3树

需要维护两种不同类型的节点(2-节点,3-节点),两种类型的节点在转换,比较等很多情况都相当麻烦,实现代码所产生的额外开销可能会导致算法比标准的二叉查找树速度更慢. 因此我们不使用直接的2-3树,而是使用更加优秀的红黑树 !

红黑树与2-3树的等价性

红黑树是 2-3 查找树,但它不需要分别定义 2- 节点和 3- 节点,而是在普通的二叉查找树之上,为节点添加颜色。指向一个节点的链接颜色如果为红色,那么这个节点和上层节点表示的是一个 3- 节点,而黑色则是普通链接(2-节点)

下图左边的2-3树与右边的红黑树是完全等价的.

2-节点等价于带有黑色链接的节点

3-节点等价于带有红色链接的节点与上层节点的结合体

红黑树的实现—点击链接

BST树, AVL树与红黑树性能总结:

对于完全随机的数据, 普通的二分搜索树很好用!
缺点: 极端情况退化为链表(或者高度不平衡)

对于查询较多的使用情况,AVL树很好用!
缺点: AVL树每次插入删除会进行大量的平衡度计算,频繁的插入删除使AVL树性能变差

红黑树牺牲了平衡性(2logN的高度),但是其统计性能更优秀(综合增删改查所有的操作)

基于红黑树实现的TreeMap和TreeSet

对TreeMap实现感兴趣请点击这个链接------Java集合干货系列-(四)TreeMap源码解析
对TreeSet实现感兴趣请点击这个链接------TreeSet源码分析
另外在Java8中HashMap的实现也使用了红黑树,具体分析请点击这个链接------红黑树在HashMap中的应用

浅析树结构(一)二叉查找树(BST树代码实现)
浅析树结构(二)AVL平衡二叉树(AVL树原理及代码实现)
浅析树结构(三)红黑树

猜你喜欢

转载自blog.csdn.net/tubro2017/article/details/86239689