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

C++:AVL树

文章目录

    • 一、AVL树的概念
    • 二、AVL树的实现
        • 1、AVL树的节点
        • 2、 AVL的插入的过程
        • 3、平衡因子的更新
    • 三、旋转
        • 1、右单旋
        • 2、左单旋
        • 3、左右双旋
        • 4、右左双旋
    • 四、AVL树平衡检测
    • 五、AVL树查找

一、AVL树的概念

二、AVL树的实现

1、AVL树的节点

key,vaule的二叉搜索树,需要用三叉链,多定义的父亲指针用来更新平衡因子

template<classK,classV>structAVLTreeNode{pair<k,v>_kv;AVLTreeNode*_left;AVLTreeNode*_right;AVLTreeNode*_parent;int_bf;//banlance factor平衡因子AVLTreeNode(constpair<K,V>&kv):_kv(kv),_left(nullptr),_right(nullptr),_parent(nullptr),_bf(0){}};
2、 AVL的插入的过程

3、平衡因子的更新

boolInsert(constpair<K,V>&kv){if(_root==nullptr){_root=newNode(kv);returntrue;}Node*parent=nullptr;Node*cur=_root;while(cur){if(cur->_kv.first>kv.first){parent=cur;cur=cur->_left;}elseif(cur->_kv.first<kv.first){parent=cur;cur=cur->_right;}elsereturnfalse;}cur=newNode(kv);cur->_parent=parent;if(parent->_kv.first>kv.first){parent->_left=cur;}else{parent->_right=cur;}//更新平衡因子while(parent){if(parent->_left==cur){--parent->_bf;}else{++parent->_bf;}if(parent->_bf==0){//平衡后结束break;}elseif(parent->_bf==-1||parent->_bf==1){//不平衡继续向上更新cur=parent;parent=parent->_parent;}elseif(parent->_bf==-2||parent->_bf==2){//高度差大于1,进行旋转//右单旋,左边高if(parent->_bf==-2&&cur->_bf==-1)RotateR(parent);elseif(parent->_bf==2&&cur->_bf==1)//纯粹的右边高,进行左单旋RotateL(parent);elseif(parent->_bf==-2&&cur->_bf==1)//进行左右双旋{RotateLR(parent);}elseif(parent->_bf==2&&cur->_bf==-1)//进行右左双旋{RotateRL(parent);}else{assert(false);}break;}else{assert(false);}}returntrue;}

三、旋转

1、持搜索树的规则
2、让旋转的树从不满⾜变平衡,其次降低旋转树的⾼度

旋转总共分为四种,左单旋/右单旋/左右双旋/右左双旋。

1、右单旋

左边的高度大于右边时右旋转

//右单旋voidRotateR(Node*parent){Node*subL=parent->_left;Node*subLR=subL->_right;Node*ppNode=parent->_parent;parent->_left=subLR;subL->_right=parent;if(subLR)subLR->_parent=parent;parent->_parent=subL;subL->_parent=ppNode;if(ppNode==nullptr){_root=subL;}else{if(ppNode->_left==parent){ppNode->_left=subL;}else{ppNode->_right=subL;}}parent->_bf=0;subL->_bf=0;}
2、左单旋

右边高进行左单旋

//左单旋voidRotateL(Node*parent){Node*subR=parent->_right;Node*subRL=subR->_left;Node*ppNode=parent->_parent;parent->_right=subRL;subR->_left=parent;if(subRL)subRL->_parent=parent;parent->_parent=subR;subR->_parent=ppNode;if(ppNode==nullptr){_root=subR;}else{if(ppNode->_left==parent){ppNode->_left=subR;}else{ppNode->_right=subR;}}parent->_bf=0;subR->_bf=0;}
3、左右双旋

//左右双旋voidRotateLR(Node*parent){Node*subL=parent->_left;Node*subLR=subL->_right;intbf=subLR->_bf;RotateL(parent->_left);RotateR(parent);if(bf==-1){subL->_bf=0;parent->_bf=1;subLR->_bf=0;}elseif(bf==1){subL->_bf=-1;parent->_bf=0;subLR->_bf=0;}elseif(bf==0){subL->_bf=0;parent->_bf=0;subLR->_bf=0;}else{assert(false);}}
4、右左双旋

//右左双旋voidRotateRL(Node*parent){Node*subR=parent->_right;Node*subRL=subR->_left;intbf=subRL->_bf;RotateR(parent->_right);RotateL(parent);if(bf==1){subR->_bf=0;parent->_bf=-1;subRL->_bf=0;}elseif(bf==-1){subR->_bf=1;parent->_bf=0;subRL->_bf=0;}elseif(bf==0){subR->_bf=0;parent->_bf=0;subRL->_bf=0;}else{assert(false);}}

四、AVL树平衡检测

boolIsBalanceTree(){return_IsBalanceTree(_root)!=-1;}int_IsBalanceTree(Node*root){if(root==nullptr)return0;intleft=_IsBalanceTree(root->_left);if(left==-1)return-1;intright=_IsBalanceTree(root->_right);if(right==-1)return-1;intdif=right-left;if(abs(dif)>=2){cout<<root->_kv.first<<"高度异常"<<endl;return-1;}if(dif!=root->_bf){cout<<root->_kv.first<<"平衡因子异常"<<endl;return-1;}returnabs(left-right)<2?max(left,right)+1:-1;}

五、AVL树查找

Node*Find(constK&key){Node*cur=_root;while(cur){if(cur->_kv.first>key){cur=cur->_left;}elseif(cur->_kv.first<key){cur=cur->_right;}elsereturncur;}returnnullptr;}
http://www.jsqmd.com/news/1249420/

相关文章:

  • 工业总线多源异构协议免编程统一转换:基于流编排的边缘清洗架构与合并实战
  • 粉剂包装机十大品牌,广州恒尔品质靠谱获一致好评 - 品牌速递
  • 语言模型语义不确定性校准:从概率原理到工程实践
  • 民宿 厂区核心景观设计施工选哪家?杭州美村美户商用景观一站式打造全维度详解 - 品牌测评网
  • VASP用于进行自洽场(SCF)计算,INCAR文件配置
  • 基于YOLO26的野生动物智能监测系统设计与优化
  • TM4C1292看门狗定时器原理与实战:从寄存器配置到高可靠设计
  • PLL-分频器
  • Kimi K3重磅发布!2.8万亿参数,碾压开源阵营?
  • 工业5G边缘计算节点IEC 62443合规实践:基于内核 Netfilter 的深度状态防火墙与工业路由器安全隔离完整架构解析
  • Django毕业设计-基于 Django 的鲜花线上销售与配送管理系统 个性化鲜花定制电商平台的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • SIM820X-M2 5G HAT OpenWrt软路由器——安装MySQL(三)问题记录
  • 劳力士苏州售后服务网点地址及客户服务热线2026年7月最新 - 劳力士服务中心
  • “十五五”规划锚定体育强国目标 惊奇体育智慧校园方案助力青少年体育数字化发展 - 米諾
  • 茂名2026年中央空调回收实测:五星推荐本土老牌商家 - 广东再生资源回收
  • 谷歌Gemini AI营销工具实战解析与应用指南
  • 线程同步——信号量
  • 基于差分对的环形振荡器
  • 深入解析TI N2HET指令集:从硬件定时器原理到汽车ECU实战编程
  • YOLOv8 训练工程车航拍数据集,1260 张航拍工程车数据集
  • Cortex-M0+ 非对齐访问 HardFault 深度剖析
  • Tiva μDMA控制器寄存器详解与实战配置指南
  • 2026年7月亲身探访杭州亨得利名表服务中心|全部地址与售后热线电话 - 亨得利官方博客
  • 电流镜电路分析仿真电路结果与分析
  • 《AI 渐进编程》之二十一:Agent 不光要交代码,还要交证据包
  • 2026 天府新区豪宅哪家好?家庭自住优选悦蓉九州 - 优企甄选
  • 【计算机毕业设计案例】基于Python的大学生每日健康打卡防疫管理系统 高校疫情公告推送与信息统计系统(程序+文档+讲解+定制)
  • TM4C1292微控制器EEPROM与Flash保护寄存器实战指南
  • C语言数组介绍
  • AI写作效率提升300%的5个隐藏技巧:从选题到爆款发布的全流程拆解