平衡二叉树旋转

本文深入探讨了红黑树在TreeMap实现中的作用,强调了掌握红黑树结构对于理解底层实现的重要性。红黑树是一种自平衡二叉查找树,其特点是左右子树高度差不超过1。文章详细阐述了四种旋转类型:右旋、左旋、LR型(左旋后再右旋)和RL型(右旋后再左旋),并提供了实例来说明如何通过旋转保持树的平衡。这些旋转操作在节点插入和删除导致不平衡时进行,以确保树的高效查找性能。
摘要由CSDN通过智能技术生成

TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解。了解红黑树的结构,有助于我们去理解一些底层具体实现。

红黑树也是对树结构的一种高度综合运用,涉及到多叉树,树平衡调整,节点旋转等。了解红黑树的旋转,可以先理解平衡二叉树旋转。

  • 二叉排序树

    通常二叉排序树呈现的特点是左子树元素值<根节点值<右子树元素值

    即右子树元素全部大于左子树元素及根节点;左子树元素全部小于右子树元素及根节点

  • 平衡二叉树

    左右子树高度差小于等于1二叉排序树

    为了符合平衡二叉树左孩子与右孩子高度只差绝对值小于等于1,那么就会形成四种旋转变形,以达到平衡。

  • 如果插入或者删除一个节点,使得高度之差大于1,就要进行节点之间的旋转,将二叉树重新维持在一个平衡的状态。

添加节点后不平衡的情况:

左左 LL  ——》右旋   

右右 RR ——》左旋

左右LR ——》左旋再右旋

右左RL ——》右旋再左旋

(原文链接)

http://t.csdn.cn/ohuz5

树的旋转总体可以归纳为这两个步骤

        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的左子节点。

(原文链接)

http://t.csdn.cn/ZOpxn

 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的右子节点。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值