数据结构——怎么去理解红黑树?

一、如何定义一棵"红黑树"?

    顾名思义,红黑树中的节点,一类被标记为黑色,一类标记为红色。除此之外,一课红黑树还需要满足这样几个要求:

    1.根节点是黑色的;

    2.每个叶子节点都是黑色的的空节点(NIL),也就是说,叶子节点不存储数据;

    3.作保相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的;

    4.每个节点,从该节点到达其可达叶子节点的所有路径,都包含数目相同的黑色节点;

二、红黑树与AVL树相比有什么优势?

     AVL树是一种高度平衡的二叉树,所以查找效率非常高,但是,有利就有弊,AVL树为维持这种高度的平衡,就要付出更多的代价。每插入删除就要付出更多的代价。每次插入、删除都要做调整,就比较复杂、耗时。所以对于有频繁的插入、删除操作的数据集合,使用AVL树的代价就有点高了。

    红黑树也是一种平衡二叉查找树。红黑树只是做到了近似平衡,但不是严格的平衡,所以在维护平衡的成本上,要比AVL树要低。所以,红黑树的插入、删除、查找各种操作性能都比较稳定。

三、实现红黑树的插入、删除需要平衡调整   

    当在插入、删除节点的过程中,红黑树的第三、第四点要求可能会被破坏,而“平衡调整”,实际上就是要把被破坏的第三、第四点恢复过来。

    在平衡调整包含两种基础的操作:左右旋转和改变颜色

    左旋(rotate left):围绕某个节点的左旋;

    右旋(rotate right):围绕某个节点的右旋;

    关于红黑树的调整,在网上有很多资料,其中红黑树很有关联的2-3-4树,这里有相关的解释,看了之后会有更深的理解:https://www.cnblogs.com/tiancai/p/9072813.html

    不过网上有很多内容看不懂,特别是在插入、删除的节点的颜色标记 红黑、黑黑,红-黑黑... 让人难以理解。

    下面写一个插入的案例,用图的方式以帮助理解;根据红黑树的4个要求来进行调整,这样思路不会跑偏。

       1、往红黑树中插入数据16,默认插入的颜色是红色,这里为什么是红色?如果为黑色,当你连续插入,会影响要求4;红色可以通过调整成为标准的红黑树;

1

    2、如上图1右图,当我们插入16之后很明显就不符合要求3,这时我们我们可以看到把只要把9,12 跟11的颜色对换,就不会影响它们下面的节点了;

        我们知道调整平衡可以用左右旋转和改变颜色,为什么要先改变颜色?因为改变颜色不会对树的结构造成变换,这样刚好这时有人在查询的时候跟之前一样! 所以我们建议先用改变颜色能不能解决,不能的话再用左右旋转。

2

    3、如上图2左图,我们可以看到11,19都是红色,很明显不符合要求3;我们发现改变11或19的颜色都会不符合要求4,这时改变颜色没有用了,那就用旋转,我们把节点11右旋转,右旋转之后见图2右图,我们发现这时已经符合要求4了,但是11,19这两个节点不符合要求3,改变11,19的颜色也不符合要求4,我们再把11左旋转。这时看图2右图我们发现这个树已经变成极不平衡了;

           红黑树有根节点黑色这一要求,所以我们在用旋转的时候只要把当前节点往上走总会有解决的时候。

3

    4、如图4,我们把11节点旋转之后,发现只要改变8,11的颜色,就可以让整个插入的操作经过调整又变成红黑树了。

    总结:经过上面插入的案例,我们发现通过改变颜色和左右旋转就可以完成对红黑树的调整,这只是一种情况的操作,我看有些资料关于红黑树的更新(插入和删除)有分好几种情况,分别要怎么去调整,其实都可以这样去总结出来的。

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前面我们提到了二叉查找树,支持快速的查找、插入和删除操作。中序遍历二叉查找树,可以输出有序的数据序列,非常高效。 ...
    KEEPINUP阅读 957评论 0赞 12
  • 平衡二叉查找树 平衡二叉树中任意一个节点的左右子树的高度相差不能大于1 完全二叉树、满二叉树都是平衡二叉树,...
    小_小_2019阅读 349评论 0赞 1
  • 二叉查找树是最常用的一种二叉树,它支持快速插入、删除、查找操作,各个操作的时间复杂度跟树的高度成正比,理想情况下,...
    acc8226阅读 827评论 1赞 3
  • 红黑树 红黑树(Red Black Tree) 是一种自平衡二叉查找树 红黑树是一种特化的AVL树(平衡二叉树[h...
    AAA前端阅读 299评论 0赞 0
  • 平衡二叉查找树的初衷,是为了解决二叉查找树因为动态更新导致的性能退化问题。红黑树是一种平衡二叉查找树。它是为了解决...
    zhujunhua阅读 253评论 0赞 0

友情链接更多精彩内容