当前位置: 首页 > web >正文

AVL树左旋右旋的实现

目录

AVL树的实现

1.节点的实现

2.AVL树的基本结构

3.基本原理

4.旋转的分类

5.代码实现

LL型

RR型


AVL树的实现

1.节点的实现

在实现左旋和右旋之前,我们先写一个AVL树的节点,由于加入了平衡因子的概念,所以我们在节点中要存入父节点和平衡因子。

template<class K, class V>
struct AVLTreeNode
{// 需要parent指针,后续更新平衡因子可以看到pair<K, V> _kv;AVLTreeNode<K, V>* _left;AVLTreeNode<K, V>* _right;AVLTreeNode<K, V>* _parent;int _bf; // balance factorAVLTreeNode(const pair<K, V>& kv):_kv(kv), _left(nullptr), _right(nullptr), _parent(nullptr), _bf(0){}//AVL树的节点
};

2.AVL树的基本结构

AVL树我们存入一个_root就可以找到所有的子树,所以私有变量给-root根节点。下面给出AVL的基本结构。

template<class K, class V>
class AVLTree
{typedef AVLTreeNode<K, V> Node;
public:private:private:Node* _root = nullptr;
};

3.基本原理

我们知道,AVL树和二叉搜索树的最根本区别是AVL树必须保持高度平衡搜索效率稳定,二叉搜索树在极端条件搜索效率退化到LOG N,我们这里就要知道AVL树是怎么控制平衡的,答案就是旋转,那我们就得知道什么时候旋转,所以我们引入了平衡因子的概念,它的大小等于右子树的高度减去左子树的高度,平衡状态下,它的值为-1,1或0,当出现2时说明这颗树该更新了,那么我们插入一个节点的时候,如果它的平衡因子没有2或-2我们就不用更新,一旦出现了2或-2,从出现2或-2的位置开始更新。

4.旋转的分类

了解了基本原理之后,我们来对旋转进行基本的分类,我把它分为LL型,LR型,RR型,RL型,这里我们解释一下,LL型就是左子树的左边高,对它进行右旋,LR型是左子树的右边高,先左旋左孩子,再右旋,RR型是右子树的右边高,对它进行左旋,RL型是右子树的左边高,先右旋右孩子,再左旋。本质就是把它的高度压低

这个是RL型,先右旋15,再左旋10.

这个是LR型,先左旋5,再右旋10

这个是LL型,右旋10.

这个是RR型,左旋10.

5.代码实现

理论已经就位了,那么我们该怎么实现呢?

首先我们要解决的是怎么识别它们的类型,先从简单的LL型和RR型说起,借助上面的图片我们可以知道:

1.当一个节点的平衡因子在插入后更新为2或-2,然后判断它的左子树左边高,我们对它进行判定为LL型,对平衡因子为2的节点进行右旋。

2.当一个节点更新为2或-2后,它的右子树的右边高我们对它进行判断为RR型。

3,当左节点的右子树高,判断为LR型。

3.当右节点的左子树高,判定为RL型。

下面是代码判断,由于左子树失衡,所以_BF为-2,又因为是左子树的左节点高,所以CUR=-1。条件满足,进行右旋。

LL型

	if (parent->_bf == -2 && cur->_bf == -1){RotateR(parent);}

这里具体实现时需要注意几个点,由于我们不知道这个调整的节点是根节点还是叶子节点,所以我们需要根据它的父亲对它进行判断,如果父亲是空,调整的节点就是根节点,不然就是叶子节点,需要改父亲。还有就是我们不知道需要调整的节点的左子树的右子树是否为空,需要对它进行判断。最后就是更改节点的指向时,记得也更改它的父亲节点。

	void RotateR(Node* parent){Node* subL = parent->_left;Node* subLR = subL->_right;parent->_left = subLR;if (subLR)subLR->_parent = parent;Node* ppnode = parent->_parent;subL->_right = parent;parent->_parent = subL;if (parent == _root){_root = subL;subL->_parent = nullptr;}else{if (ppnode->_left == parent){ppnode->_left = subL;}else{ppnode->_right = subL;}subL->_parent = ppnode;}subL->_bf = parent->_bf = 0;}

RR型

if(parent->bf==2&&parent->right->bf==1)
{//进行左旋
}

同样的需要注意和右旋类似的事情。

	void RotateL(Node* parent){/*Node* subR = parent->_right;Node* subRL = subR->_left;parent->_right = subRL;if (subRL)subRL->_parent = parent;Node* ppnode = parent->_parent;subR->_left = parent;parent->_parent = subR;if (parent == _root){_root = subR;subR->_parent = nullptr;}else{if (ppnode->_left == parent){ppnode->_left = subR;}else{ppnode->_right = subR;}subR->_parent = ppnode;}parent->_bf = subR->_bf = 0;*/auto ppnode = parent->_parent;//保存调整节点的父节点。auto subr = parent->_right;auto subrl = subr->_left;if (subrl != nullptr){parent->_right = subrl;subrl->_parent = parent;subr->_left = parent;parent->_parent = subr;if (ppnode == nullptr){subr->_parent = nullptr;_root = subr;}else if (ppnode != nullptr){subr->_parent = ppnode;}}else if (subrl == nullptr){parent->_right = subrl;subr->_left = parent;parent->_parent = subr;if (ppnode == nullptr){subr->_parent = nullptr;_root = subr;}else if (ppnode != nullptr){subr->_parent = ppnode;}}parent->_bf = subr->_bf = 0;}

至于RL型和LR型,我们一篇博客再见,如有错误请多指正,博主十分感激!!!

http://www.xdnf.cn/news/3039.html

相关文章:

  • C语言加餐--浮点数比较
  • 文件基础-----C语言经典题目(10)
  • 前端Vue3 + 后端Spring Boot,前端取消请求后端处理逻辑分析
  • 第35周Zookkeeper+Dubbo Zookkeeper
  • Transformer数学推导——Q32 可学习位置编码的梯度更新公式推导
  • Arkts完成数据请求http以及使用axios第三方库
  • 杭州数据库恢复公司之Dell服务器RAID5阵列两块硬盘损坏报警离线
  • 服务器远程超出最大连接数的解决方案是什么?
  • 如何创建并使用极狐GitLab 项目访问令牌?
  • 基于esp32的小区智能门禁集成系统设计和实现
  • BFS最短路
  • Vue + ECharts 实现多层极坐标环形图
  • 基于STM32、HAL库的ATECC508A安全验证及加密芯片驱动程序设计
  • java练习2
  • langchain 简单与ollama 关联使用
  • Thinkphp开发自适应职业学生证书查询系统职业资格等级会员证书管理网站
  • SMPP协议解析
  • mysql数据库连接数不足导致 Bean 注入失败
  • 4月28号
  • TCP三次握手
  • [TxRxResult] There is no status packet! 及 Incorrect status packet! 问题修复
  • 第一章 应急响应- Linux入侵排查
  • 文件基础-----C语言经典题目(11)
  • 前端vue2修改echarts字体为思源黑体-避免侵权-可以更换为任意字体统一管理
  • Linux 权限管理
  • API文档生成与测试工具推荐
  • 提示词工程实战指南:解锁AI创作的隐藏技巧与实例
  • AI驱动全流程基于PLUS-InVEST模型的生态系统服务多情景智能模拟与土地利用优化、论文写作
  • Python3: 函数式编程特性
  • 基于Spring Boot 电商书城平台系统设计与实现(源码+文档+部署讲解)