红黑树基础-第二篇-删除

写在前面

总结了红黑树的几篇文章,总感觉意犹未尽,从当初我惧怕红黑树到现在理解红黑树,真是下了不少功夫,但是也不得不感谢一篇文章,讲红黑树还算透彻,图解比较好,但是仍然有部分我不理解的地方或是我觉得有缺陷的地方,所以我决定自己总结一番彻底搞懂红黑树,并结合java8中HashMap的源码部分进行分析,简直睡觉都迟迟不能忘怀,梦里都是树节点移动的样子。

刚开始,红黑树犹如我面前的一座大山,我真的很畏惧它,它太庞大了,越过他要考虑很多种分支情况,稍不注意就会陷入迷宫陷阱,因此我很敬畏它,换句话说,我很敬畏算法,因为我搞不定他。

每当我每次信誓旦旦打算彻底看看红黑树的原理时,要么看HashMap中红黑树源码就看不懂了,要么翻遍别人的博客看别人的文章时,也觉得别人写的不够清楚,他写的我也知道,要么就是图解不清晰。总而言之,分析了几种情况就进行不下去了,不知道为什么要这样分析推理,所以那个时候自己的心也很简单。

心里想着,反正红黑树这么难,别人知道的也不会有几个人吧,甚至我朋友说,你leader的leader说不定也理解不了,我只能一笑而过,所以好吧,我放弃了。要么就是自己心里太浮躁,不能沉下心来认真分析图解每一种情况,还有可能就是自己真没有一大段时间去积累,去看,去分析源码和图,因为红黑树确实吃透需要的时间很多,我在有一定知识储备的基础上,写了3-4篇博客连续用了一周的时间才把红黑树理解下来弄懂,所以坚定的毅力还是必须要有的。

刚开始看的时候,我连左旋右旋都觉得很别扭,不能快速旋转建立树结构,但是多看看多想想就觉得总算是趟过了山前面的一条小河,这下有信心了一点,然后开始看红黑树的平衡插入,开始分析每一种插入节点的情况,静下心来看,然后看HashMap源码中平衡插入部分,逐渐柳暗花明,慢慢的理解了平衡插入,这个时候我信心倍增。我下定决心要把平衡删除啃下来。

但是看来我想错了,平衡删除远比平衡插入要难,理解起来更复杂,图解也会复杂一些。我又回到了起点。但是我没有放弃,当我打算放弃时,我还是回头了,因为我已经走到了半山腰,我不得不耐心的走下去,开始认真分析每一种情况,为什么要节点互换等,为什么节点的变色要这么变。走到山那边,才发现世外桃源,原来山看上去很高,但实际上很窄。

不得不说,以下红黑树的删除部分是红黑树最难的部分,能有幸啃下来,也算是618期间奖励自己一瓶红牛吧,(tips:今天6月17日晚,大家都值班,算有空)

红黑树的删除

红黑树的删除操作也包括两部分工作:一是查找目标结点;二是删除后自平衡。

查找目标结点显然可以复用查找操作,当不存在目标结点时,忽略本次操作;当存在目标结点时,删除后就得做自平衡处理了。

删除了结点后,我们还需要找结点来替代删除结点的位置,不然子树跟父辈结点断开了,除非删除结点刚好没子结点,那么就不需要替代。

二叉树删除结点找替代结点有 3 种情景:我们假设现在暂不考虑变色等,因为删除节点后还要满足红黑树的性质,我们暂不考虑,只为了先保持树的结构。

  • 若删除结点无子结点,直接删除。
  • 若删除结点只有一个子结点,用子结点替换删除结点。
  • 若删除结点有两个子结点,用后继结点(大于删除结点的最小结点)替换删除结点。

补充说明下,情景 3 的后继结点是大于删除结点的最小结点,也是删除结点的右子树中投影到数轴的最左结点。

那么可以拿前继结点(删除结点的左子树最左结点)替代吗?可以的。但习惯上大多都是拿后继结点来替代,后文的讲解也是用后继结点来替代。

另外告诉大家一种找前继和后继结点的直观的方法:把二叉树所有结点投射在X轴上,所有结点都是从左到右排好序的,所有目标结点的前后结点就是对应前继和后继结点。如下图

红黑树基础-第二篇-删除_第1张图片

接下来,讲一个重要的思路:删除结点被替代后,在不考虑结点的键值的情况下,对于树来说,可以认为删除的是替代结点!话很苍白,我们看下图。

你可能感兴趣的:(数据结构,红黑树,红黑树删除)