算法学习04——树(四)AVL树和旋转操作原理

本文介绍了AVL树的基本概念,包括高度定义和AVL树的平衡条件。在插入操作可能导致不平衡时,通过单旋转和双旋转来恢复平衡。单旋转用于处理节点的左子树或右子树的插入,而双旋转则适用于更复杂的情况,确保AVL树保持良好的平衡状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树(四)——AVL树和旋转操作原理

基本概念

高度:根到其叶子的的最长路径距离,空子树的高度被规定为-1。
AVL树是带有平衡条件的二叉查询树。通常来说,一棵AVL树的每个节点的左子树和右子树的高度最多相差1。在高度为h的AVL树中,节点数最少是S(h),S(h)可由递推关系得出:S(h)=S(h-1)+S(h-2)+1;同时S(0)=1;S(1)=2。
当进行插入操作的时候,需要更新通向根节点路径上的那些节点的所有平衡信息。而插入一个新节点有可能导致AVL树的平衡情况被破坏,需要通过旋转来修复。

旋转

可以发现一个节点,它的新平衡情况破坏了AVL条件,重新平衡这个节点将保证整个树重新满足AVL性质。
这个必须重新平衡的节点叫做α。它最多有两个儿子,所以一共有以下四种情况:

  1. 对α的左儿子的左子树进行一次插入
  2. 对α的左儿子的右子树进行一次插入
  3. 对α的右儿子的左子树进行一次插入
  4. 对α的右儿子的右子树进行一次插入

情况1和4是相同的情况,通过单旋转可以恢复平衡条件。情况2和3是相同的情况,可以通过双旋转来恢复平衡条件。

单旋转

出现1和4的情形可以使用单旋转:
在这里插入图片描述

如图中需要在子树1中添加节点,这会破坏4节点的平衡情况。首先,这是由于子树1的高度增加导致的平衡条件破坏,也就是子树1增加一个节点后会增加1的高度。而子树5此时和节点2的高度相差1,在子树1增加一个节点后高度差变成2。由此可见需要降低子树1的一个高度,作为代价增加子树5的一个高度,增加子树5的高度不会影响整棵树的平衡性,因为它本来就比节点2的高度少1,加一个高度的话高度差也才变成0。于是进行下图的变换:即将子树3变成4节点的左子树,2节点变成新的根节点,4节点变成2节点右子树。
在这里插入图片描述

这将会使子树1的高度减1,子树3的高度不变,子树5的高度加1.整理后可得:
在这里插入图片描述

双旋转

在2和3的情况中,插入操作发生在子树3中,经过上述的分析,单旋转无法改变子树3的高度,因此2和3的情况无法通过使用单旋转来达到平衡。在此描述双旋转的操作:
在这里插入图片描述

我们假设要插入的右子树有两个儿子3和5(没有儿子也没有任何关系,认为3和5是null就行),将子树3变成节点6的左子树,子树5变成节点2的右子树,2和6分别变成节点4的左右儿子。也就是4变成了新的根节点,如下:
在这里插入图片描述
显而易见,子树3和5降低了一个高度,子树1没有变化,子树7增加了一个高度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值