红黑树(1)真的只说原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mottohlm/article/details/81545073

树可以分为两大类:平衡的树和不平衡的树。

那些都有自己大名的自然就是平衡的树。我们使用树这结构就是看中它插删与搜索拥有同等的高效 O(log n)。

平衡树的特点就是每层都几乎布满,不会出现某一分支特别长的情况。因为树的查找跟层数有关,层数越大越耗时间。如果有10个节点就有10层,那就跟链表一样了。

现在要学习的这个“红黑树”就是其中平衡树的一种。

接下来展开想像力:

前提所有的叶子节点都在同一层上

如果每个节点只能放一个值,那么肯定存在不在同一层的时候,比如四个值的时候(2个的那个就不说了)。根占了一个,要么左边2右边1,要么右边2左边1.

既然放1个不行,那就放2个、3个嘛。

 

 

红黑树的原来就是这样,某“节点”可以放多个(红黑树中最多可以有3个值)。

原理是这样,但我们看多种语言中无论是Java 还是C++它们都是一个节点都存一个值。为什么呢。因为我们画图上看很清晰明了,但实际实现的时候会碰到多种问题。最直接能想到的就是资源浪费。每个节点最多能放三个值,那么初始时肯定是留三个位置的。如果最后每个节点只有一个值,那亏的是用的2倍。当然还有其他的原因。由此来看,如果没想到其他办法,每个节点存一个值是最经济也最简单明了的。那么我如果约束一个树平衡呢(要像每个节点可放多值一样约束)。

我们“物理”上不可能,可以在逻辑上实现嘛。

我们把本该放于同一节点的值,转换成父子节点的关系,但是我规定”这个“子节点是和“这个“父节点是一起的。有什么标志呢?

”红“和”黑“啊(你想叫”玫瑰金“和”孔雀蓝“也是可以的)

到这里大家应该明白了为什么会有红黑这两东西了吧。

由此大家应该明白了很多大家看”红黑树原理及算法“之中的规定为什么要这么规定了吧。比如:

1.每个节点为红或者为黑

 :     (这不废话嘛)其实也不算废话,只少知道不会有蓝色(哈哈)。但我相信大部分文档是不会告诉你为什么要这么分。完整看完上面码字的相信已经知道为什么会有红黑的区别了。

2.如果一个节点是红色的,则它的子节点必须是黑色的(或类似这种描述)

:前面我们说了红黑树的原理是一个”节点“中最多可放3个值而不是4个,却没说为什么(当然要问为什么)。因为二叉树的一个节点最多会有两个分支的,那么如果这两个分支的节点都是红的话那么就表示这”三父子“都是在一个”节点“的。当然最多也就三个,秉着物尽其用的原则,当然就3个了。有人会说4个也可以啊,拿子节点的子节点来标红。那我就想说这两个子节点的子节点总共有4个,你是想哪一个标红呢。再往下说下去就越说越复杂了,在此打住,3个是比较明了的啦。其实该问题的人话就是“不能有两个连续红包的节点”。就是因为父节点占了中间位置,左边只有一个空位了(右边有另一个,那是留给右边的),所以只有一个能标红的,连续两个那是破坏规矩的了。

3.从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点

:这就是红黑树的一个特性。什么叫特性呢,就是你睁开眼看上去能总结出来的规律。这没啥好说的,因为真正的层数是黑色说的算(红色就是黑色的一个附属品),我们是号称“所有叶子都在同一层的平衡树”嘛,那每一条线的黑包当然要相同啦,不同你平衡个屁啊。

......

 

其实只要了解红黑树的“真实身份”,我们是不要记那么多规定,那么多特性的。

展开阅读全文

没有更多推荐了,返回首页