Treap
了解即可
堆树
比如谷歌的搜索引擎
搜索black live better
二叉查找树
binary search tree
查找理想效率logn 但是会出现树的深度远远大于logn的情况:

平衡二叉查找树(AVL树)
简称平衡二叉树
1.可以是空树
2.假如不是空树,任何一个节点的左子树与右子树都是平衡二叉树,并且高度之差的绝对值不超过1
但是完全平衡的AVL树又会增加复杂度
红黑树
红黑树是不完全严格的AVL树
手撕没必要,面试官都不一定会手撕,掌握原理能讲懂就行
比如:明星产品HashMap,jdk1.8之后链表超过8就会变成红黑树
(1)定义
1.根节点是黑色的
2.每个叶子节点都是黑色的空节点(NIL),也就是说,叶子结点不存储数据
3.任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的
4.每个节点,从该节点到达其可达叶子结点的所有路径,都包含相同数目的黑色节点
比如:
(最后一层的黑的叶子空节点有的没有画出来)
有点像魔方的复原
(2)插入节点
原则:
插入的时候,节点必须是红色的
先介绍左旋和右旋
1.左旋
暂时没有红黑,只有旋转
2.右旋
3.不要动的情况
1.空的
根节点红色转黑色就行
2.插入的地方父节点和叔叔节点都是黑色的
直接插入就行
平衡被打破就要旋转
4.父黑
父节点是黑色的,直接接上插入的红节点
5.父红叔红
把父变红,叔变红
6.父红叔黑
解释,如下图,比如圈出来的这个点,他是祖父节点的左边,又是,父节点的左边,所以为“左左”
(p是父节点,g是祖父节点,u是叔叔节点,x是要插入的节点)
左左
右旋,变p、g的颜色
左右
先以p左旋,然后就到了左左的情况
右左
跟左右对称
右右
跟左左对称
7.动图讲解
左左
左右
右左
右右
8.举例
先后插入10、70、32、34、13、56、21
(3)删除节点
左红的意思是,删除的是左边的节点,删除的节点的兄弟节点是红色的
左
红
1.将兄弟节点设为黑色
2.将兄弟的左孩子设为红色
3.对父节点左旋
黑
无节点
兄弟变色
有右节点
1.父节点的颜色给兄弟节点
2.将父节点和兄弟节点的右孩子都设为黑色
3.对父节点左旋转
有左节点
1.将该左孩子设为黑色
2.将兄弟节点设为红色
3.对兄弟节点右旋
4.回到叶子节点是右的情况
有两个节点
1.将父节点的颜色给兄弟节点
2.将兄弟节点的右孩子设为黑色
3.将父节点设为黑色
4.对父节点左旋
右
左的镜像
红
1.兄弟变黑
2.右孩子变红
3.兄弟右旋
黑
无叶子节点
兄弟变色
有右孩子
1.右孩子变黑
2.兄弟节点变红
3.兄弟左旋
4.变成有做孩子的情况
有左孩子
1.父节点颜色给兄弟节点
2.父节点和左孩子都变成黑色
3.兄弟右旋
左右都有
1.父节点颜色给兄弟
2.左孩子变黑,父节点黑色
3.兄弟右旋
B树
更加优化一些:B树
Balance Tree
注意右上方的N和N+1的意思
B+树
B树已经很牛逼了,但是MySQL里用的是另外一种,B+树
注意到叶子节点也是有箭头指向的,对于查找范围数据很友好,不需要从头开始查询。
可以看到索引的方式其实有两种: