有序表
有序表的有所操作效率为O(logN),实现有序表的结构包括红黑树,AVL树,SizeBalance树简称SB树,跳表skiplist。
在时间复杂度层面,上面四种结构是一样的。
其中,红黑树、AVL树、SB树属于 同一个系列,那就是平衡搜索二叉树系列。
平衡搜索二叉树
搜索二叉树
搜索二叉树的定义就是,每个节点小于他的都在其左孩子上,大于他的都在右孩子上。
搜索二叉树的插入操作:
就是依次从头节点开始比较,大于就往右走,小于就往左走,直到找到其位置。
搜索二叉树的删除操作:
没有孩子节点:直接删除
有一个孩子节点:由孩子节点填补删除位置
有左右节点:左树的最右节点或者右树的最右节点填补
搜索二叉树的缺点:如果数据状况不好,就会生成单链表结构,因此,平衡搜索二叉树可以解决这个问题。
平衡搜索二叉树
平衡搜索二叉树就是把不平衡的搜索二叉树,通过左旋和右旋操作,变平衡。平衡操作的基本操作就是左旋和右旋。
右旋
把左孩子上位,然后,把之前的根节点连在左孩子的右边,然后,之前左孩子的右树,连在A左边
左旋同理
AVL树
AVL树的平衡定义:
任意一个节点的左右子树的高度差不能超过1
因此,AVL树的不平衡状态,就包括四种情况:
LL型
左孩子的左树过长,导致不平衡
右旋即可恢复平衡
RR型
右孩子的右树过长,导致不平衡
左旋即可恢复平衡
LR型
左孩子的右树过长,导致不平衡
就让左孩子的右孩子转到头节点,也就是要经过一次左旋后,再右旋一次
RL型
右孩子的左树过长,导致不平衡
就让右孩子的左孩子转到头节点,也就是要经过一次右旋后,再左旋一次
红黑树
红黑树底层也是平衡搜索二叉树,其删除节点、修改节点、查找节点、增加节点、检查时机的操作和AVL树一样。唯一的区别就是,平衡标准不一样,也就是,对于平衡的定义不同,本质上都是平衡搜索二叉树
红黑树定义:
1.每个节点,不是红就是黑
2.头节点和叶子节点(红黑树中,叶节点指底层的空指针节点)必须为黑
3.红节点不能相邻
4.从任意一个节点开始,走到结束的路径中,要求黑节点的数量一样。
分析
因此,分析上述条件,任何一条路径,最长的就是红黑红黑交替嘛,对吧?因为要求红节点不能相邻,只能红黑交替,同时,又要求黑节点一样多,因此,最短路径就是全黑节点。那么,交替情况下的长度,顶多也就是全黑路径长度多一倍。这就是红黑树的平衡定义
SB树
每棵子树的大小,不小于其兄弟的子树的大小,也就是每棵叔叔树的大小,不小于任何侄子树的大小。
怎么理解?
假如,一个叔叔节点大小为10,那么,他的两个侄子最大不能超过叔叔,也就是最大为10,加上他们父节点,最大为21,也就是说,爷爷的两个孩子直接,最大差距也就是一倍多一个,这就是SB树的平衡定义。
总结
总结来说,AVL树、SB树、红黑树,本质都是二叉搜索树,只不过,在搜索树的前提下,提供了左旋和右旋调整平衡的操作,注意,这三种结构调整平衡的步骤都是左旋右旋。因此,由于这三种结构对平衡的定义不同,因此,出现不平衡的判断条件不同,导致他们调用左旋右旋的策略不同,他们的区别,仅此而已。