红黑树简单介绍

  • Post author:
  • Post category:其他


红黑树是二插平衡树的再优化,二插平衡树强制要求左右子树高度差不能超过1,并且它的左右子树也得是二插平衡树。这就导致每次添加、删除元素时需要大量的操作保持树的平衡,红黑树在其基础上优化,它不强制要求高度差必须小于1,但也尽可能保证树相对平衡,查询效率也高

首先红黑树需要满足以下几条规则:

  1. 节点非黑即红
  2. 根节点必须黑色
  3. 每个叶节点(不是叶子节点,页节点值 NIL 或空节点)必须是黑色
  4. 每个红色节点的两个子节点必须是黑色
  5. 从任一节点到每个叶节点所经过的黑色节点数目相同

也就是说,无论我们执行添加或者删除操作,首先都必须保证以上五条原则。最后我列举出红黑树常见的几种平衡策略:

首先,如果每次插入的节点为黑色,就一定打破规则五。而插入节点为红色的话,可能打破规则2和规则4,相对而言更容易操作,所以一般情况下红黑树默认插入节点颜色为红色

  • 当插入节点为根节点时,直接把红色涂黑即可,不会破坏任何规则
  • 当插入节点的父节点为黑色的时候,不会破坏任何规则
  • 当插入节点的父节点为红色,此时会违反规则四

如果自身是父节点的左子树,父节点为祖父节点的左子树,并且叔叔为黑色:

红黑树情况

此时只需将祖父节点右旋同时将祖父节点和父节点的颜色进行互换即可,互换后的结果如下:

红黑树

如果自身是父节点的右子树:

红黑树

这里首先对父节点进行左旋,左旋后的结果如下:

红黑树

把原先的父节点看做要插入的节点,原先要插入的节点看做父节点,此时情况就变成上面提到的那种,此时需要执行祖父节点的右旋即换色,执行完后红黑树的结构如下:

在这里插入图片描述

。。。

其他不同的场景情况以后有空再整理,感兴趣的可以

点击这里

查看更详细的介绍


最后基于红黑树谈谈我的个人理解:红黑树无疑是对二插平衡树的一次改进优化。在二插平衡树中,由于强制维护左右子树高度差不能超过1,因此需要大量的左旋、右旋操作来维护二叉树的平衡。但在红黑树中打破了这种限制,它通过上面提到的五条规则,在减少红黑树左右旋操作的情况下保证查询效率接近 log2n。这五条规则主要保证以下优点:

  • 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长

假设现在从根节点到叶节点所经过的黑色节点数为 n,那么最短情况下:所有节点都为黑色节点,即长度为 n。最长情况下每两个黑色节点间都插有一个红色节点,长度为 n + (n – 1),因此高度差不可能出现两倍

也就是说红黑树的查询效率是线性的,平均情况下约等于 log2n,但它减少了大量的左移、右移次数,因此效率很高



版权声明:本文为m0_57015193原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。