C++:AVL树

文章目录

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

一、AVL树的概念

在这里插入图片描述

二、AVL树的实现

1、AVL树的节点

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

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

在这里插入图片描述

3、平衡因子的更新

在这里插入图片描述

在这里插入图片描述

	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->_left;}else if (cur->_kv.first < kv.first){parent = cur;cur = cur->_right;}elsereturn false;}cur = new Node(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;}else if (parent->_bf == -1 || parent->_bf == 1){//不平衡继续向上更新cur = parent;parent = parent->_parent;}else if (parent->_bf == -2 || parent->_bf == 2){//高度差大于1,进行旋转//右单旋,左边高if (parent->_bf == -2 && cur->_bf == -1)RotateR(parent);else if (parent->_bf == 2 && cur->_bf == 1)//纯粹的右边高,进行左单旋RotateL(parent);else if (parent->_bf == -2 && cur->_bf == 1)//进行左右双旋{RotateLR(parent);}else if (parent->_bf == 2 && cur->_bf == -1)//进行右左双旋{RotateRL(parent);}else{assert(false);}break;}else{assert(false);}}return true;}

三、旋转

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

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

1、右单旋

左边的高度大于右边时右旋转
在这里插入图片描述

	//右单旋void RotateR(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、左单旋

右边高进行左单旋
在这里插入图片描述

//左单旋
void RotateL(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、右左双旋

在这里插入图片描述

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

在这里插入图片描述

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

四、AVL树平衡检测

bool IsBalanceTree()
{return _IsBalanceTree(_root) != -1;
}int _IsBalanceTree(Node* root){if (root == nullptr)return 0;int left = _IsBalanceTree(root->_left);if (left == -1)return -1;int right = _IsBalanceTree(root->_right);if (right == -1)return -1;int dif = right - left;if (abs(dif) >= 2){cout << root->_kv.first << "高度异常" << endl;return -1;}if (dif != root->_bf){cout << root->_kv.first << "平衡因子异常" << endl;return - 1;}return abs(left - right) < 2 ? max(left, right) + 1 : -1;}

五、AVL树查找

	Node* Find(const K& key){Node* cur = _root;while (cur){if (cur->_kv.first > key){cur = cur->_left;}else if (cur->_kv.first < key){cur = cur->_right;}elsereturn cur;}return nullptr;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/34755.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Vscode插件 :用于生成文件头部注释和函数注释

最近找到了一个好用的vscode生成注释的插件----koroFileHeader 1.在拓展中搜索&#xff0c;并且安装 2.找到setting.json 设置模板 点击ctrlp(windows and linus),commandp(mac) 输入 > Open Settings 点击第一个选项 并且用以下代码进行覆盖 // 头部注释 "file…

知从科技闪耀汽车智能底盘大会:共探软件安全新篇章

在汽车科技蓬勃发展的浪潮中&#xff0c;智能底盘技术正成为引领行业变革的关键力量。11月27日-28日&#xff0c;盖世汽车 2024 第四届汽车智能底盘大会盛大召开&#xff0c;上海知从科技有限公司受邀出席此次盛会&#xff0c;与众多汽车领域的精英齐聚一堂&#xff0c;共话智能…

LabVIEW密码保护与反编译的安全性分析

在LabVIEW中&#xff0c;密码保护是一种常见的源代码保护手段&#xff0c;但其安全性并不高&#xff0c;尤其是在面对专业反编译工具时。理论上&#xff0c;所有软件的反编译都是可能的&#xff0c;尽管反编译不一定恢复完全的源代码&#xff0c;但足以提取程序的核心功能和算法…

ABAP 类与对象 EXCEPTIONS与RAISE

文章目录 ABAP 类与对象 EXCEPTIONS与RAISE系统示例代码执行结果RAISE的系统文档测试 ABAP 类与对象 EXCEPTIONS与RAISE 系统示例 代码 CLASS cls DEFINITION.PUBLIC SECTION.CLASS-METHODS meth EXCEPTIONS exc. ENDCLASS.CLASS cls IMPLEMENTATION.METHOD meth....RAISE ex…

接第二部分 Advanced Learning Algorithms

接第二部分 Advanced Learning Algorithms 文章目录 接第二部分 Advanced Learning AlgorithmsMachine learning development process(机器学习开发的迭代)Iterative loop of ML development错误分析(error analysis)添加数据(Adding data)迁移学习&#xff1a;使用其他任务中的…

AI新动向:豆包文生图升级,文心一言领先市场

在今日的AI资讯中&#xff0c;我们关注到了几个重要的行业动态&#xff0c;其中包括字节跳动AI助手豆包的功能升级&#xff0c;以及百度文心一言在生成式AI市场的领先地位。 字节跳动旗下的智能AI助手豆包近期对其文生图能力进行了显著提升&#xff0c;用户现在可以通过一键操…

力扣54.螺旋矩阵

题目描述 题目链接54. 螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a;…

【第 1 章 初识 C 语言】1.10 - 1.11 本书的组织结构、本书的约定

目录 1.10 本书的组织结构 1.11 本书约定 1.11.1 字体 1.11.2 程序输出 特殊的击键 本书使用的系统 读者的系统 1.11.3 特殊元素 1.10 本书的组织结构 本书采用多种方式编排内容&#xff0c;其中最直接的方法是介绍 A 主题的所有内容、介绍 B 主题的所有内容&#xff0…

# 06_Python基础到实战一飞冲天(三)-python面向对象(六)--类属性和类方法和单例

06_Python基础到实战一飞冲天&#xff08;三&#xff09;-python面向对象&#xff08;六&#xff09;–类属性和类方法和单例 一、类属性-05-使用对象名类属性赋值语句会创建实例属性 1、使用对象名访问类属性的问题注意 如果使用 对象.类属性 值 赋值语句&#xff0c;只会…

【目标跟踪】DUT Anti-UAV数据集详细介绍

DUT Anti-UAV数据集是大连理工大学的团队公开的数据集&#xff08;DUT是他们学校的简称&#xff09;&#xff0c;其中包括了两个子数据集&#xff1a;目标检测和目标跟踪&#xff08;也就是说&#xff0c;目标检测和目标跟踪都可以用这个数据集&#xff09;。该数据集为可见光模…

★ 数据结构 ★ 排序

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将和大家一起学习数据结构中的各种排序~ ​❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页&#xff1a;椎名澄嵐-CSDN博客 数据结构专栏&#xff1a;https://blog.csdn.net/2302_80328146/categ…

c语言基础三:运算符和表达式

一、常用的运算符分类 运算符类型 作用 算术运算符 用于处理四则运算 赋值运算符 用于将表达式的值赋给变量 比较运算符 用于表达式的比较&#xff0c;并返回一个真值或假值 逻辑运算符 用于根据表达式的值返回真值或假值 位运算符 用于处理数据的位运算 s…

如何通过金蝶云星空高效集成销售出库单

金蝶云星空数据集成案例分享&#xff1a;销售出库单-&#xff08;分销&京东&唯品&虚拟除外&#xff09;手表汇总 在企业信息化系统中&#xff0c;数据的高效流转和准确对接是业务运作的关键。本文将聚焦于一个具体的系统对接集成案例&#xff0c;即如何将金蝶云星…

【SKFramework框架核心模块】3-4、事件模块

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群&#xff1a;398291828小红书小破站 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【Unity3D框架】SKFramework框架完全教程《全…

鸿蒙分享:添加模块,修改app名称图标

新建公共模块common 在entry的oh-package.json5添加dependencies&#xff0c;引入common模块 "dependencies": {"common": "file:../common" } 修改app名称&#xff1a; common--src--resources--string.json 新增&#xff1a; {"name&q…

逆向攻防世界CTF系列48-Signin.md

逆向攻防世界CTF系列48-Signin.md 直接定位 输入&#xff0c;然后跟踪96A 一个整数一个余数你会发现这是把输入字符变成两个分开的十六进制存储起来&#xff0c;比如输入字符 ‘1’ &#xff0c;它的整数是49&#xff0c;49除16的整数是3&#xff0c;余数是1&#xff0c;在byt…

最新版Chrome谷歌加载ActiveX控件之金格iWebOffice2015控件

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

Lakehouse 架构下的元数据“大一统”管理深度解析

在湖仓一体&#xff08;Lakehouse&#xff09;出现之前&#xff0c;数据仓库和数据湖堪称数据领域的两大“顶流”。打个比方&#xff0c;要是把数据仓库比作一座大型图书馆&#xff0c;那其中的数据就如同馆内藏书&#xff0c;需要按照规范放好&#xff0c;借阅者只需依照类别索…

【AI系统】MobileVit 系列

MobileVit 系列 自 Vision Transformer 出现之后&#xff0c;人们发现 Transformer 也可以应用在计算机视觉领域&#xff0c;并且效果还是非常不错的。但是基于 Transformer 的网络模型通常具有数十亿或数百亿个参数&#xff0c;这使得它们的模型文件非常大&#xff0c;不仅占…

投稿指南——论文检索报告如何开具

【SciencePub学术】论文发表被SCI数据库收录之后&#xff0c;作为学术成果上报时&#xff0c;一般需要提供论文检索报告&#xff0c;SCI论文检索报告怎么开&#xff1f;在哪开&#xff1f;要注意什么&#xff1f;这些问题&#xff0c;本期小编给大家解答一下。 Q 开具检索报告…