TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解。了解红黑树的结构,有助于我们去理解一些底层具体实现。
红黑树也是对树结构的一种高度综合运用,涉及到多叉树,树平衡调整,节点旋转等。了解红黑树的旋转,可以先理解平衡二叉树旋转。
-
二叉排序树
通常二叉排序树呈现的特点是左子树元素值<根节点值<右子树元素值
即右子树元素全部大于左子树元素及根节点;左子树元素全部小于右子树元素及根节点
-
平衡二叉树
左右子树高度差小于等于
1
的二叉排序树为了符合平衡二叉树左孩子与右孩子高度只差绝对值小于等于1,那么就会形成四种旋转变形,以达到平衡。
-
如果插入或者删除一个节点,使得高度之差大于1,就要进行节点之间的旋转,将二叉树重新维持在一个平衡的状态。
添加节点后不平衡的情况:
左左 LL ——》右旋
右右 RR ——》左旋
左右LR ——》左旋再右旋
右左RL ——》右旋再左旋
(原文链接)
树的旋转总体可以归纳为这两个步骤
1.先找到第一个不平衡节点
平衡因子不为1(左子节点-右子节点 >1)
2.确定旋转的左右节点 (找中位数节点)
把这3个结点中的中位数提到根结点。
LL型
当新节点添加在最小不平衡树根节点的左孩子的左子树且造成不平衡时使用此旋转
如图所示,节点4为不平衡节点, 以3节点为中心右旋,4比3大,4成为3的右子节点,3成为5的左子节点
例2
如图所示,节点9的平衡因子为(3-1=2),所以它是不平衡节点,以6为中心节点右旋,9比6大,9成为6的右子节点;因为原本7是6的右子节点,7比9小,7成为9的左子节点。
(原文链接)
RR型
当新节点添加在最小不平衡树根节点的右孩子的右子树且造成不平衡时使用此旋转
如图所示,当添加节点10的时候,会导致5节点的左右子树不平衡,平衡因子为2,5节点为不平衡节点。中位数节点为8节点,以8节点为中心左旋。旋转后,8节点到达根节点位置,5节点成为8的右子节点,原本8节点的左子节点6比5大,移动到5的右子节点。
总结:
左旋:即将父亲结点当做自己的左孩子
右旋:即将父亲结点当做自己的右孩子
LR型
左旋再右旋——当新节点添加在最小不平衡树根节点的左孩子的右子树且造成不平衡时使用此旋转
添加8节点后不平衡,不平衡节点是9,找到中位数7,以7为中心先左旋,节点5成为节点7的左孩子;再以7节点为中心右旋,根节点9旋转成为到7的右孩子,原本节点7的右孩子比9小,旋转到9的左子节点。
RL型
右旋再左旋——当新节点添加在最小不平衡树根节点的右孩子的左子树且造成不平衡时使用此旋转
如图所示,添加节点8后不平衡,不平衡节点为7,找到中位数9,以9为中心右旋,节点10成为9的右子节点,再以9为中心左旋,9成为根节点,7成为9的左子树,原本9的左子节点8成为7的右子节点。