30张图带你彻底理解红黑树

红黑树定义和性质

红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须满足下面性质:

  1. 每个节点要么是黑色,要么是红色。
  2. 根节点是黑色。
  3. 每个叶子节点(NIL)是黑色。

  4. 每个红色结点的两个子结点一定都是黑色。
  5. 任意一结点到每个叶子结点的路径都包含数量相同的黑结点。
![红黑树](https://upload-images.jianshu.io/upload_images/2392382-4996bbfb4017a3b2.png?imageMogr2/auto-orient/stripimageView2/2/w/526/format/webp)

自平衡

三种操作:左旋、右旋和变色。

![左旋](https://upload-images.jianshu.io/upload_images/2392382-a95db442f1b47f8a.png?imageMogr2/auto-orient/stripimageView2/2/w/1200/format/webp)
![右旋](https://upload-images.jianshu.io/upload_images/2392382-0676a8e2a12e2a0b.png?imageMogr2/auto-orient/stripimageView2/2/w/1200/format/webp)

红黑树的查找

红黑树是一颗二叉平衡树,并且查找不会破坏树的平衡,所以查找跟二叉平衡树的查找无异。

HashMap中的红黑树是根据节点key的hash值大小,其次是比较compare,如果都相等或者无法比较,就执行一个内置的方法打破僵局。

TreeMap的红黑树,只用比较的方式,因为是有序的,TreeMap不允许key为null。

红黑树的插入

插入操作包括两部分工作:一查找插入的位置;二插入后自平衡。查找插入的父结点很简单,跟查找操作区别不大。

红黑树插入过程

红黑树的删除

二叉树删除结点找替代结点有3种情情景:

删除结点被替代后,在不考虑结点的键值的情况下,对于树来说,可以认为删除的是替代结点!

基于此,上面所说的3种二叉树的删除情景可以相互转换并且最终都是转换为情景1!

综上所述,删除操作删除的结点可以看作删除替代结点,而替代结点最后总是在树末。

![红黑树的删除](https://upload-images.jianshu.io/upload_images/2392382-edaf96e55f08c198.png?imageMogr2/auto-orient/stripimageView2/2/w/1035/format/webp)

Tagged #Java集合.