首先咱们要说一个事情是 红黑树其实就是一种特殊的二叉平衡树。 那咱们奇怪了,二叉平衡树哪里不好呢? 需要引入这么个改进版。 一般改进的东西肯定比不改进的东西牛,那么牛在哪里呢?
回忆一下二叉平衡树的特点是 左节点的值小于 根节点 小于 右节点。那么,如果我们有 1 2 3 4 四个元素,插入二叉平衡树,可能出现下面的情况吗?
这两种情况都可能出现吧。什么?还有左边这种情况?直觉上就觉得不太对吧。
是的,少年,你的直觉是对的。左边这种情况效率就比较低。想想,如果我们要找 1. 左边这种情况找3次 而右边这种情况两次就够了。
所以引出了树里面一个很重要的概念 “平衡”,就是右边这种情况啦。当然,右边也不是绝对平衡,把右边的1 去掉就是平衡。 但是凡事很难尽善尽美嘛。差不多平衡我们也是可以接受的。而红黑树就是追求这种平衡。红黑树的定义比平衡二叉树复杂很多,没办法啊,你多了很多性质啊,规则不复杂点,一般就很难保证嘛。
红黑树的定义有四条:
- 每个节点颜色不是黑色,就是红色
- 根节点是黑色的
- 如果一个节点是红色,那么它的两个子节点就是黑色的(没有连续的红节点)
- 对于每个节点,从该节点到其后代叶节点的简单路径上,均包含相同数目的黑色节点
那么我们简单说明一下,以上图右边的部分来简单解释一下:
3 是根节点 1 4 是叶子节点, 2是1的父节点, 4是1的叔叔节点, 毕竟2和4是兄弟嘛。
这里还要特别注意一下,通常我们初始化一个新节点,我们通常假设该节点是红色。因为这样上面4条性质更容易被满足,换言之,我们可以尽可能少的调整。
简单来说,我们看这个性质1, 不是黑色就是红色,满足。(我们默认红色)
性质二,根节点为黑色(如果没有根节点,我们把加入的这个节点变成 黑色,如果有,不影响)
性质3, 每个节点是红色,两个子节点是黑色。这个由于我们不知道插入在哪里,所以不清楚,疑似不满足
性质4, 每个节点到后代叶子节点的黑色节点数目相同。(满足,我们加的是红色节点啊默认)
今天关于红黑树就简单说到这里。最近改论文改的很累。不过坚持每天过来更新。我个人的习惯就是遇到一个比较难的问题,就一点一点的看。千万不要贪多图快。下一篇博客,咱们接着讨论红黑树的基本操作,即如何保持红黑树平衡特性。 咱们每天学一点点,再难的问题最终都会被我们解决