news 2026/4/17 11:21:16

AVL树的四种旋转操作用于在插入或删除节点导致二叉树失去平衡

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AVL树的四种旋转操作用于在插入或删除节点导致二叉树失去平衡

一、平衡二叉树(AVL 树)
设计目的:保证二叉排序树的高度为 $ O(\log_2 n) $,使插入、删除、查找等操作的最坏时间复杂度稳定在 $ O(\log_2 n) $。普通二叉排序树在极端情况下可能退化为链表,导致操作时间复杂度上升至 $ O(n) $。

核心定义:

  • 满足BST 性质:即对于任意节点,左子树所有节点值小于根节点值,右子树所有节点值大于根节点值。
  • 平衡条件:任一节点的左右子树高度差(称为平衡因子)的绝对值不超过 1。平衡因子 = 左子树深度 - 右子树深度,其值只能是 -1、0 或 1。

高度特性:
含有 $ n $ 个节点的 AVL 树,其最大高度约为 $ 1.44 \log_2 n $,远优于最坏情况下的 $ O(n) $,接近完全二叉树的理想高度 $ \log_2 n $。

为了维持平衡,在插入或删除节点后若出现不平衡(平衡因子变为 ±2),需通过旋转操作(单旋:LL、RR;双旋:LR、RL)进行调整,恢复平衡。


二、线索二叉树(Threaded Binary Tree)
设计目的:解决普通二叉树中无法高效获取某节点在中序遍历中的前驱和后继的问题。同时利用原本浪费的空指针域(n 个节点共有 $ n+1 $ 个空指针)来存储有用的线索信息,提高空间利用率和遍历效率。

实现方式:

  • 将空的左指针改为指向该节点在中序遍历中的前驱节点。
  • 将空的右指针改为指向该节点在中序遍历中的后继节点。
  • 引入两个标志位:
    • ltag:0 表示左指针指向左孩子,1 表示左指针为线索,指向前驱。
    • rtag:0 表示右指针指向右孩子,1 表示右指针为线索,指向后继。

节点结构示例(C语言风格):

structBTnode{intdata;structBTnode*left,*right;intltag;// 0: child, 1: thread (predecessor)intrtag;// 0: child, 1: thread (successor)};

通过中序线索化后,可以不使用栈或递归实现高效的中序遍历,直接沿线索访问下一个节点。
AVL树的四种旋转操作用于在插入或删除节点导致二叉树失去平衡(即某个节点的平衡因子变为±2)时,恢复其平衡性。这些旋转操作根据失衡节点与其子树中“过高”部分的位置关系分为四类:LL、RR、LR、RL。


一、四种旋转类型及适用场景

类型全称触发条件(以失衡节点为z场景描述
LL型Left-Leftz 的左子树比右子树高 2,且 z 的左孩子(y)的左子树更高(平衡因子为 +1 或 +2)失衡路径连续向左,形成“左偏左”结构
RR型Right-Rightz 的右子树比左子树高 2,且 z 的右孩子(y)的右子树更高(平衡因子为 -1 或 -2)失衡路径连续向右,“右偏右”结构
LR型Left-Rightz 的左子树过高,但 z 的左孩子的右子树更高先左后右的“Z”字形结构
RL型Right-Leftz 的右子树过高,但 z 的右孩子的左子树更高先右后左的镜像“Z”字形

📌核心思想:通过一次或两次旋转将“过高”的中间节点提升为新的根,使树重新满足 AVL 平衡条件。


二、旋转操作实现(C语言风格)

假设节点结构如下:

typedefstructAVLNode{intdata;structAVLNode*left;structAVLNode*right;intheight;// 存储当前节点高度,便于计算平衡因子}AVLNode;

辅助函数:获取高度与平衡因子

intmax(inta,intb){return(a>b)?a:b;}intheight(AVLNode*node){returnnode==NULL?0:node->height;}intgetBalance(AVLNode*node){returnnode==NULL?0:height(node->left)-height(node->right);}
1.右单旋(LL旋转)

适用于 LL 型失衡。

AVLNode*rotateRight(AVLNode*y){AVLNode*x=y->left;AVLNode*T2=x->right;// 执行右旋x->right=y;y->left=T2;// 更新高度(先更新子节点,再更新父节点)y->height=max(height(y->left),height(y->right))+1;x->height=max(height(x->left),height(x->right))+1;returnx;// 新的根节点}
2.左单旋(RR旋转)

适用于 RR 型失衡。

AVLNode*rotateLeft(AVLNode*x){AVLNode*y=x->right;AVLNode*T2=y->left;// 执行左旋y->left=x;x->right=T2;// 更新高度x->height=max(height(x->left),height(x->right))+1;y->height=max(height(y->left),height(y->right))+1;returny;// 新的根节点}
3.左右双旋(LR旋转)

先对左孩子左旋(RR),再对根右旋(LL)。

AVLNode*rotateLeftRight(AVLNode*z){z->left=rotateLeft(z->left);// 左孩子做一次左旋(RR)returnrotateRight(z);// 再整体右旋(LL)}
4.右左双旋(RL旋转)

先对右孩子右旋(LL),再对根左旋(RR)。

AVLNode*rotateRightLeft(AVLNode*z){z->right=rotateRight(z->right);// 右孩子做一次右旋(LL)returnrotateLeft(z);// 再整体左旋(RR)}

三、插入后的平衡调整逻辑示例

AVLNode*insert(AVLNode*node,intdata){// 1. 标准BST插入if(node==NULL){AVLNode*newNode=(AVLNode*)malloc(sizeof(AVLNode));newNode->data=data;newNode->left=newNode->right=NULL;newNode->height=1;returnnewNode;}if(data<node->data)node->left=insert(node->left,data);elseif(data>node->data)node->right=insert(node->right,data);elsereturnnode;// 不允许重复值// 2. 更新当前节点高度node->height=max(height(node->left),height(node->right))+1;// 3. 获取平衡因子intbalance=getBalance(node);// 4. 判断失衡类型并旋转调整// LL型if(balance>1&&data<node->left->data)returnrotateRight(node);// RR型if(balance<-1&&data>node->right->data)returnrotateLeft(node);// LR型if(balance>1&&data>node->left->data){node->left=rotateLeft(node->left);returnrotateRight(node);}// RL型if(balance<-1&&data<node->right->data){node->right=rotateRight(node->right);returnrotateLeft(node);}returnnode;// 已平衡,返回原节点}

总结记忆口诀

  • “同方向用单旋”:LL → 右旋,RR → 左旋
  • “异方向用双旋”:LR → 先左旋左孩子,再右旋根;RL → 先右旋右孩子,再左旋根
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 1:22:59

17、Debian系统管理基础与实用工具介绍

Debian系统管理基础与实用工具介绍 在Linux世界中,Debian系统以其稳定性和丰富的软件包管理系统而闻名。除了软件安装管理外,Debian还拥有许多专门为其设计的系统管理工具。这些工具遵循DFSG(Debian自由软件指南),为系统管理员提供了强大的功能。下面将详细介绍Debian系统…

作者头像 李华
网站建设 2026/4/18 7:02:52

探索四种商品售货机:MCGS 7.7 与三菱 PLC 联机之旅

4四种商品售货机mcgs7.7和三菱plc联机程序5&#xff0c;带运行效果视频5&#xff0c;带cad的plc接线图在自动化控制领域&#xff0c;实现设备之间的高效联机通信是打造智能系统的关键。今天就来聊聊四种商品售货机中 MCGS 7.7 和三菱 PLC 的联机程序&#xff0c;并且还有运行效…

作者头像 李华
网站建设 2026/4/17 18:30:21

毕设 基于单片机的太阳追光系统(源码+硬件+论文)

文章目录 0 前言1 课题介绍光线追踪的原理系统架构 2 硬件设计3 核心软件设计4 实现效果5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断…

作者头像 李华
网站建设 2026/4/18 3:58:36

26、Linux 文本格式化与打印全解析

Linux 文本格式化与打印全解析 1. printf 的格式化应用 在脚本编写中, printf 是一个强大的工具,常用于格式化表格数据,而非直接在命令行中使用。下面我们来看看它是如何解决各种格式化问题的。 首先,输出由制表符分隔的字段: [me@linuxbox ~]$ printf "%s\t%…

作者头像 李华
网站建设 2026/4/18 3:57:47

无网络也能用!Flutter+开源鸿蒙构建轻量级应急通信系统

###欢迎大家加入开源鸿蒙跨平台开发者社区&#xff0c;一起共建开源鸿蒙跨平台生态。 无网络也能用&#xff01;Flutter开源鸿蒙构建轻量级应急通信系统 应急场景下的离线通信系统设计与实现 在自然灾害&#xff08;如地震、洪水&#xff09;、野外探险或军事行动等应急场景下…

作者头像 李华