事实总是因为人的欲望产生的,
想要才会有,而当大多数人想的一样的时候
就只会变成后人所得到生活
往复
引:
红黑树,应运而生
啊(叹气),反正我是这么认为的
比原来的它略显成熟,但又涉世不深,却又显其独到的风采
述:
需求,是红黑树的生来原因,哪方面呢,姑且我认为是效率
规则引来查询二叉树,简简单单,不复杂,说一就是一,说再见就再也不会见
但人的关系总是很复杂,规则也是相对的。当然也渲染到了查询二叉树身上
红黑树也只是复杂的其中一种而已,满足人们的欲求不满,可以这么说么?
路口一
基本理解树
基本理解二叉树
懂,普通查询二叉树的规则
理解,普通查询二叉树的不足
了解,红黑树的规则
针对看得懂伪代码不明白为什么case x,case x的人
就够了,否则就在这个路口选择离开吧
路口二
在这再次灌输一个概念,
网上的教程很多,当然我这也不算是教程,只是自己的想法。
大部分教程没见过有自己想法的,抄书倒是抄的6的不行。
*-*-*-*-*-*-*-*-*-*I‘m 分割线*-*-*-*-*-*-*-*-*-*红黑树无非就是拥有新的规则的查询二叉树
叙述过程中先假设点东西
p指父亲的父亲
w指父亲的兄弟
z指当前节点
在添加了新规则后
1.改善查询二叉树的平衡性
文字叙述:目的也是为了使树本身平衡,不要使根节点到某一叶结点的过于极端,从而较低查询效率
图叙述:插入顺序为5-4-6-7-8的结果,普通查询二叉树(图1),红黑树(图2)
图1 图2
2.引入新概念黑高度
文字叙述:某一点的黑高度就是其到叶结点的所经过颜色为黑的节点数
图叙述:根算法导论上图不太一样,但还是一个意思
*-*-*-*-*-*-*-*-*-*I‘m 分割线*-*-*-*-*-*-*-*-*-*
插入后修改节点颜色操作
需求:插入元素后任然遵守规则
方法:穷尽所有可能
思路:因为插入后只可能影响到父节点和根节点从而破坏规则,所以可能就可以基本的确定
实际情况:
*-*-*-*I‘m 小分割线*-*-*-*
情况一:w是红色
分析:因为z是红色,所以p一定为黑色
解决
文字:
1.p染红,w染黑
应该有的想法:w是红色,p就染红,w就染黑。有人问过为什么么?为什么这么做就可以了?为什么不先旋转玩玩,再干点别的什么,喝一杯抽根烟什么的?
个人看法:要改变点的颜色,就得确保改变后不影响它子女的红黑性质,才可以通过修改颜色达到目的。因为w是红色,改变它的颜色不会改变它子女的红黑性质,所以不需要旋转(后面会介绍什么时候需要)。w不影响,p呢,的确是影响,所以它重新进入循环!那有人说了,改变w不改变它的H么?这里还是要明确H是整体的要求!
分析:没变化之前H的情况为图1,加入节点后此时H平衡但违反了红节点子女一定为黑节点的规则,思路是将p的黑色下降到子女节点上,从而在不改变H的情况下,恢复被破坏的规则(图2、3),然后将p作为新插入的节点再次进入循环,但p为根节点时,也就会结束循环,但根不为黑,这时为确保这一规则,在不论任何条件结束循环都要将根节点染黑(图4)
图:
图1 图2
图3 图4
*-*-*-*I‘m 小分割线*-*-*-*
情况二:w是黑色
分析:因为z是红色,所以p一定为黑色
解决
文字:
1.将z做适当旋转,在将新的父节点做适当旋转【什么叫做适当?】,并将旋转后的w染红,父节点染黑
应该有的想法:为什么突然就旋转了,改改颜色不就好了么,为什么上面的情况不需要呢?
个人看法:w是黑色,若是直接通过修改颜色,加入改了w,黑->红,那它的子女玩意有红怎么办?是不是w也坏掉了?是不是还得修复w,这就不是你的目的了,目的就是要修复一个,不影响其他!所以先旋转,将这个w做适当旋转,致使不影响它的情况下通过修改颜色达到目的。当然旋转在删除操作的修改方面可能不是这个意思,这个在后面再次讨论。但在插入方面还是觉得就是这个意思。
分析:假设在情况一图4继续添加元素8。为什么要左旋呢?因为在现有的结构上做修改,修改w必破坏它的黑高度,会将问题复杂化也就是会不经意间将w作为新的z重新调整,所以要旋转,将w先完全置问题之外。旋转后,因为新的w的黑高度比z~(也就是原来的z)大1,这时将其变红,H减1,但是旋转后的父节点的H少了1,将其变黑,使总体H不变。
图1 图2
图3 图4
2.什么叫做适当?
适当也就是相对,假如还是情况一图4,但是z变成了父节点的左子,旋转之后(图5),那我只能说是悲剧,影响就大了,到底是修改那个点呢,原来的w也牵扯进去了,就算再次修改,就不是z~一个点了,w也要改,所以要适当,也就是算法导论case2、case3的区别。
图5
图:单独放图感觉达不到理解的感觉,就穿插的玩了。
后记:
1.写好了,居然不小心全没了,但写一次就是一次新的发现。
2.没有写第二遍,我都忘记我多久没有自己思考了,当然只局限与算法这方面。
3.音乐贴更新了。