一、平衡二叉树
平衡二叉搜索树、AVL树
它是一棵有序二叉树,它的左右子树高度差不超过1,且它的所有子树都满足这个条件
如果有一个有序的二叉树接近单支状,它的查找效率很接近链表,因此只有当它达到平衡时它的查找效率是最高的
由于是有序二叉树,节点的位置是要受到值影响,所以只能通过调整节点关系来达到平衡状态
平衡二叉树不平衡的基础原因:
x y
/ \ / \
y t1 以y为轴向右旋转 z x
/ \ / \ / \
z t2 t3 t4 t2 t1
/ \
t3 t4
x y
/ \ / \
t1 y 以y为轴向左旋转 x z
/ \ / \ / \
t2 z t1 t2 t3 t4
/ \
t3 t4
x x z
/ \ / \ / \
y t1 z t1 y x
/ \ / \ / \ / \
t2 z y t4 t2 t3 t4 t1
/ \ / \
t3 t4 t2 t3
以z为轴左旋转 以z为轴右旋转
x x z
/ \ / \ / \
t1 y t1 z x y
/ \ / \ / \ / \
z t2 t3 y t1 t3 t4 t2
/ \ / \
t3 t4 t4 t2
以z为轴右旋转 以z为轴左旋转
注意:都是找中间值为轴 进行左旋右旋
二、红黑树
是一种自平衡的二叉树,但不是严格遵循高度差不超过1原则,是一种伪平衡的二叉树,是通过节点的高度以及节点的颜色来达到相对平衡的状态
红黑树的特征:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
红黑树的优缺点:(为什么要选择红黑树?)
优点:插入、删除效率比AVL树要高,因为旋转调整的频率没有AVL树高
缺点:没有AVL树那么平均,查找效率没有AVL树那么高,但是也不差
红黑树的综合性能是最优的,很多的标准库的数据结构的底层实现是使用了红黑树