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

数据结构【AVL树】

AVL树

  • 1.AVL树
    • 1.AVL的概念
    • 2.平衡因子
  • 2.AVl树的实现
    • 2.1AVL树的结构
    • 2.2AVL树的插入
    • 2.3 旋转
      • 2.3.1 旋转的原则

1.AVL树

1.AVL的概念

AVL树可以是一个空树。
它的左右子树都是AVL树,且左右子树的高度差的绝对值不超过1。AVL树是一颗高度平衡搜索二叉树,通过控制高度差去控制平衡。
AVL树整体结点数量和分布和完全二叉树类似,高度可以控制在 logN ,那么增删查改的效率也可以控制在O(logN ) ,相比二叉搜索树有了本质的提升。

2.平衡因子

结点的平衡因子=右子树的高度减去左子树的高度,也就是说任何结点的平衡因子等于0/1/-1,AVL树并不是必须要平衡因子,但是有了平衡因子可以更方便我们去进行观察和控制树是否平衡,就像⼀个风向标一样。
为什么AVL树是高度平衡搜索二叉树,要求高度差不超过1,而不是高度差是0呢?
因为例如二和四个结点无法达到0.

2.AVl树的实现

2.1AVL树的结构

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){}
};
template<class K, class V>
class AVLTree
{typedef AVLTreeNode<K, V> Node;
public://...
private:Node * _root = nullptr;
};

2.2AVL树的插入

bool Insert(const pair<K, V>& kv)
{if (_root == nullptr){_root = new Node(kv);return true;}Node* parent = nullptr;Node* cur = _root;while (cur){if (cur->_kv.first < kv.first){parent = cur;cur = cur->_right;}else if (cur->_kv.first > kv.first){parent = cur;cur = cur->_left;}else{return false;}}cur = new Node(kv);if (parent->_kv.first < kv.first){parent->_right = cur;}else{parent->_left = cur;}cur->_parent = parent;// 更新平衡因⼦while (parent){// 更新平衡因⼦if (cur == parent->_left)parent->_bf--;elseparent->_bf++;if (parent->_bf == 0){// 更新结束break;}else if (parent->_bf == 1 || parent->_bf == -1){// 继续往上更新cur = parent;parent = parent->_parent;}else if (parent->_bf == 2 || parent->_bf == -2){// 不平衡了,旋转处理break;}else{assert(false);}}return true;
}

2.3 旋转

2.3.1 旋转的原则

保持搜索树的规则
让旋转的树从不满足变平衡,其次降低旋转树的高度
旋转总共分为四种,左单旋/右单旋/左右双旋/右左双旋。

http://www.dtcms.com/a/196046.html

相关文章:

  • AIGC在电商行业的应用:革新零售体验
  • MinIO深度解析:从入门到实战——对象存储系统全指南
  • exit耗时高
  • STM32中的DMA
  • Vue3学习(组合式API——父、子组件间通信详解)
  • C++学习:六个月从基础到就业——C++11/14:auto类型推导
  • Linux517 rsync同步 rsync借xinetd托管 配置yum源回顾
  • ChatGPT + DeepSeek 联合润色的 Prompt 模板指令合集,用来润色SCI论文太香了!
  • SECERN AI提出3D生成方法SVAD!单张图像合成超逼真3D Avatar!
  • day27 python 装饰器
  • 低空经济发展现状与前景
  • 使用lvm进行磁盘分区
  • 致敬经典 << KR C >> 之打印输入单词水平直方图和以每行一个单词打印输入 (练习1-12和练习1-13)
  • 基于Spring Boot和Vue的在线考试系统架构设计与实现(源码+论文+部署讲解等)
  • DeerFlow试用
  • 基于单片机的防盗报警器设计与实现
  • RT Thread FinSH(msh)调度逻辑
  • 计算机网络体系结构深度解析:从理论到实践的全面梳理
  • UE中的各种旋转
  • 视频下载器 2.3.9 | 自动识别并下载网页视频,界面简洁无广告带私密空间
  • AIStarter Windows 版本迎来重磅更新!模型插件工作流上线,支持 Ollama / ComfyUI 等多平台本地部署模型统一管理
  • c/c++的opencv的轮廓匹配初识
  • 使用 CodeBuddy 开发一款富交互的屏幕录制与注释分享工具开发纪实
  • A级、B级弱电机房数据中心建设运营汇报方案
  • 学习笔记:黑马程序员JavaWeb开发教程(2025.4.6)
  • 如何防止SQL注入攻击?
  • 使用ts-node搭建typescript运行环境
  • 现货黄金跌破 3160 美元,市场行情剧烈波动​
  • Node.js 实战三:Token 认证、Session 管理与中间件设计实战
  • 高并发内存池|定长内存池的设计