十分钟带你复习红黑树(动图讲解)

3,598 阅读3分钟

Treap

了解即可

堆树

比如谷歌的搜索引擎

搜索black live better

image.png

二叉查找树

binary search tree

查找理想效率logn 但是会出现树的深度远远大于logn的情况:

image-20220913133237519

平衡二叉查找树(AVL树)

简称平衡二叉树

1.可以是空树

2.假如不是空树,任何一个节点的左子树与右子树都是平衡二叉树,并且高度之差的绝对值不超过1

但是完全平衡的AVL树又会增加复杂度

红黑树

红黑树是不完全严格的AVL树

手撕没必要,面试官都不一定会手撕,掌握原理能讲懂就行

比如:明星产品HashMap,jdk1.8之后链表超过8就会变成红黑树

(1)定义

1.根节点黑色

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

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

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

比如:

image-20220913135422009

(最后一层的黑的叶子空节点有的没有画出来)

有点像魔方的复原

(2)插入节点

原则:

插入的时候,节点必须是红色的

先介绍左旋和右旋

1.左旋

暂时没有红黑,只有旋转

image-20220913140202881

2.右旋

image-20220913140405287

3.不要动的情况

1.空的

根节点红色转黑色就行

2.插入的地方父节点和叔叔节点都是黑色的

image-20220913140820868

直接插入就行

平衡被打破就要旋转

4.父黑

父节点是黑色的,直接接上插入的红节点

5.父红叔红

把父变红,叔变红

image-20220913141718040

6.父红叔黑

解释,如下图,比如圈出来的这个点,他是祖父节点的左边,又是,父节点的左边,所以为“左左”

(p是父节点,g是祖父节点,u是叔叔节点,x是要插入的节点)

image-20220913141943498

左左

右旋,变p、g的颜色

image-20220913142209552

左右

先以p左旋,然后就到了左左的情况

image-20220913144154664

右左

跟左右对称

image-20220913144449484

右右

跟左左对称

image-20220913144324858

7.动图讲解

左左

动画 (3)

左右

动画 (3)

右左

动画 (9)

右右

动画 (8)

8.举例

先后插入10、70、32、34、13、56、21

image-20220913145111848

image-20220913145118472

image-20220913145124871

image-20220913145307999

image-20220913145343360

image-20220913145550088

image-20220913145731083

(3)删除节点

image-20220913151946183

左红的意思是,删除的是左边的节点,删除的节点的兄弟节点是红色的

1.将兄弟节点设为黑色

2.将兄弟的左孩子设为红色

3.对父节点左旋

image-20220913151838757

无节点

兄弟变色

image-20220913152928582

有右节点

1.父节点的颜色给兄弟节点

2.将父节点和兄弟节点的右孩子都设为黑色

3.对父节点左旋转

image-20220913153540975

有左节点

1.将该左孩子设为黑色

2.将兄弟节点设为红色

3.对兄弟节点右旋

4.回到叶子节点是右的情况

image-20220913153906248

有两个节点

1.将父节点的颜色给兄弟节点

2.将兄弟节点的右孩子设为黑色

3.将父节点设为黑色

4.对父节点左旋

image-20220913154224662

左的镜像

1.兄弟变黑

2.右孩子变红

3.兄弟右旋

image-20220913155029366

无叶子节点

兄弟变色

image-20220913155140239

有右孩子

1.右孩子变黑

2.兄弟节点变红

3.兄弟左旋

4.变成有做孩子的情况

image-20220913155735663

有左孩子

1.父节点颜色给兄弟节点

2.父节点和左孩子都变成黑色

3.兄弟右旋

image-20220913155406291

左右都有

1.父节点颜色给兄弟

2.左孩子变黑,父节点黑色

3.兄弟右旋

image-20220913160148545

B树

更加优化一些:B树

Balance Tree

image-20220913160538032

注意右上方的N和N+1的意思

image-20220812175418986

B+树

B树已经很牛逼了,但是MySQL里用的是另外一种,B+树

image-20220913160555269

image-20220913160619829

注意到叶子节点也是有箭头指向的,对于查找范围数据很友好,不需要从头开始查询。

可以看到索引的方式其实有两种:

image-20220813135009711