关于平衡二叉树节点的定义

struct AVLTreeNode {AVLTreeNode(const pair<K, V>& kv) :_pLeft(nullptr), _pRight(nullptr), _pParent(nullptr), _kv(kv), _bf(0) {};AVLTreeNode<K, V>* _pLeft; //左孩子AVLTreeNode<K, V>* _pRight; //右孩子AVLTreeNode<K, V>* _pParent; //双亲节点int _bf; //平衡因子 控制二叉树平衡  _bf = RightH - leftHpair<K, V> _kv;  //Key-value 每一个Key对应value
};

关于插入节点:

先按照二叉搜索树的方式插入数据,如果key大于AVL->key向右走,或者key小于AVL->key向左走,否则说明key已经存在,那就丢弃掉直接返回false
插入后,根据规则更新双亲节点的平衡因子
如果哪个节点的平衡因子|_bf| > 2则需要通过旋转来调整

关于找到节点插入位置部分代码

Node* parent = nullptr;
Node* cur = _root;
while (cur) {if (cur->_kv.first > kv.first) { //如果插入的key小于此时节点的key 此时的cur指针就需要向左边调整,同时需要将parent的指针指向cur->parentparent = cur;cur = cur->_pLeft;}else if (cur->_kv.first < kv.first) { //如果插入的key大于此时节点的key 此时的cur指针就需要向右边调整,同时需要将parent的指针指向cur->parentparent = cur;cur = cur->_pRight;}else {return false;}
}

有关于调整每个节点的平衡因子


通过规律得知,如果调整到双亲节点 的平衡因子为0时结束调整,如果不为0 或者 大于等于2(小于等于-2)就继续向上调整

关于调整平衡因子:

四种旋转方式: 左旋, 右旋, 左右旋, 右左旋

左旋:

#include<iostream>
#include<vector>
using namespace std;template<class K, class V>
struct AVLTreeNode {AVLTreeNode(const pair<K, V>& kv) :_pLeft(nullptr), _pRight(nullptr), _pParent(nullptr), _kv(kv), _bf(0) {};AVLTreeNode<K, V>* _pLeft;AVLTreeNode<K, V>* _pRight;AVLTreeNode<K, V>* _pParent;int _bf;pair<K, V> _kv;
};template<class K, class V>
class AVLTree {typedef AVLTreeNode<K, V> Node;
public: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->_pLeft;}else if (cur->_kv.first < kv.first) {parent = cur;cur = cur->_pRight;}else {return false;}}cur = new Node(kv);if (parent->_kv.first < kv.first) {parent->_pRight = cur;cur->_pParent = parent;}else if (parent->_kv.first > kv.first) {parent->_pLeft = cur;cur->_pParent = parent;}while (parent) {if (cur == parent->_pLeft) {parent->_bf--;}else {parent->_bf++;}if (parent->_bf == 0) {break;}else if (parent->_bf == 1 || parent->_bf == -1) {cur = parent;parent = parent->_pParent;}else if (parent->_bf == 2 || parent->_bf == -2) {if (parent->_bf == 2) {if (cur->_bf == 1) {RotateL(parent);}else if (cur->_bf == -1) {RotateRL(parent);}}if (parent->_bf == -2) {if (cur->_bf == -1) {RotateR(parent);}else if (cur->_bf == 1) {RotateLR(parent);}}break;}}return true;}void InOrder(){_InOrder(_root);}
private:Node* _root = nullptr;void RotateL(Node* parent) { //×óµ¥ÐýNode* subR = parent->_pRight;Node* subRL = subR->_pLeft;parent->_pRight = subRL;if (subRL) {subRL->_pParent = parent;}subR->_pLeft = parent;Node* pparent = parent->_pParent;parent->_pParent = subR;if (_root = parent) {_root = subR;subR->_pParent = nullptr;}else{if (pparent->_pLeft == parent) {pparent->_pLeft = subR;}else {pparent->_pRight = subR;}subR->_pParent = pparent;}parent->_bf = subR->_bf = 0;}void RotateR(Node* parent) {  //ÓÒµ¥ÐýNode* subL = parent->_pLeft;Node* subLR = subL->_pRight;parent->_pLeft = subLR;if(subLR){subLR->_pParent = parent;}subL->_pRight = parent;Node* pparent = parent->_pParent;parent->_pParent = subL;if (_root == parent) {_root = subL;subL->_pParent = nullptr;}else {if (pparent->_pLeft == parent) {pparent->_pLeft = subL;}else {pparent->_pRight = subL;}subL->_pParent = pparent;}parent->_bf = subL->_bf = 0;}void RotateLR(Node* parent) {Node* subL = parent->_pLeft;Node* subLR = subL->_pRight;int bf = subLR->_bf;RotateL(parent->_pLeft);RotateR(parent);if (bf == -1) {parent->_bf = 1;subL->_bf = 0;subLR->_bf = 0;}else if (bf == 1) {parent->_bf = -1;subL->_bf = 0;subLR->_bf = 0;}else {parent->_bf = 0;subL->_bf = 0;subLR->_bf = 0;}}void RotateRL(Node* parent) {Node* subR = parent->_pRight;Node* subRL = subR->_pLeft;int bf = subRL->_bf;RotateR(parent->_pRight);RotateL(parent);if (bf == -1) {parent->_bf = 0;subR->_bf = 1;subRL->_bf = 0;}else if (bf == 1) {parent->_bf = -1;subR->_bf = 0;subRL->_bf = 0;}else {parent->_bf = 0;subR->_bf = 0;subRL->_bf = 0;}}void _InOrder(Node* root){if (root == nullptr)return;_InOrder(root->_pLeft);cout << root->_kv.first << ":" << root->_kv.second << endl;_InOrder(root->_pRight);}
};

AVL树关于不平衡旋转问题相关推荐

  1. 浅析AVL树--AVL树的双旋转

    浅析AVL树–AVL树的双旋转 接上篇博文:浅析AVL树–AVL树的概念及单旋转 AVL树如何恢复平衡之双旋转 首先假设我们有一颗已经处于平衡的AVL树: 上篇博文已经解决了LL和RR两种情况的平衡恢 ...

  2. 数据结构:关于AVL树的平衡旋转详解

    前言 本文是基于你已经有一定的二叉排序树知识.如果你还是小白,可以参考我之前的博客:<数据结构:二叉搜索树(BST)的基本操作>.所以,在本文中不会再出现关于BST树的基本知识. 版权说明 ...

  3. 【数据结构笔记12】平衡二叉树,AVL树,RR旋转/LL旋转/LR旋转/RL旋转,AVL树插入的代码实现

    本次笔记内容: 4.2.1 什么是平衡二叉树 4.2.2 平衡二叉树的调整 文章目录 什么是平衡二叉树 评价查找长度ASL 平衡因子(Balance Factor,BF) 平衡二叉树(Balanced ...

  4. 从AVL树的定义出发,一步步推导出旋转的方案。

    本文从AVL树的定义出发,一步步地推导出AVL树旋转的方案,这个推导是在已经清楚地知道AVL树的定义这个前提下进行的.文章注重思考的过程,并不会直接给出AVL树是怎样旋转的,用来提醒自己以后在学习的时 ...

  5. AVL树的单双旋转解析

    [0]README 0.0) 本文部分idea 转自:http://blog.csdn.net/collonn/article/details/20128205 0.1) 本文专注于 解析 AVL 树 ...

  6. 实现平衡二叉树(AVL树)的旋转

    给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在. 左边 BST 存在的问题分析:               1) 左子树全部为空,从形式上看,更像一个单链 ...

  7. AVL树(二)之 C++的实现

    AVL树(二)之 C++的实现 概要 上一章通过C语言实现了AVL树,本章将介绍AVL树的C++版本,算法与C语言版本的一样. 目录 1. AVL树的介绍 2. AVL树的C++实现 转载请注明出处: ...

  8. AVL树(一)之 C语言的实现

    概要 本章介绍AVL树.和前面介绍"二叉查找树"的流程一样,本章先对AVL树的理论知识进行简单介绍,然后给出C语言的实现.本篇实现的二叉查找树是C语言版的,后面章节再分别给出C++ ...

  9. 数据结构与算法——二叉平衡树(AVL树)详解

    文章目录 AVL树概念 不平衡概况 四种平衡旋转方式 RR平衡旋转(左单旋转) LL平衡旋转(右单旋转) RL平衡旋转(先右后左双旋转) LR平衡旋转(先左后右单旋转) java代码实现 总结 AVL ...

最新文章

  1. Spring----学习参考博客书单链接
  2. ARM中 __IO的作用解析
  3. 如何在SAP云平台ABAP编程环境里把CDS view暴露成OData服务
  4. java获取类名不包括路径
  5. mysql表设计 列命名_MYSQL数据库字段命名及设计规范
  6. Android新手之旅(12) URL解码
  7. 使用电脑群控制手机时,电脑硬件配置如何配?
  8. 迪普交换机恢复出厂设置_迪普产品配置文档-基础篇(2012-11-05).pdf
  9. 论本我、自我、超我对人工智能的启示
  10. ncnn 载入insightface训练好的性别年龄识别模型
  11. ISP(八) Gamma原理详解
  12. Navigator的正确打开方式
  13. pyecharts基本图表1——Calender(日历图)笔记
  14. 明天软考的童鞋进来顶起!!!
  15. 网络编程--TCP/IP协议(一)
  16. MAC电脑 安全与隐私 中没有任何来源选项怎么办
  17. TCP三次握手和四次挥手抓包详解
  18. 什么是专利查新检索报告?
  19. Linux常用的几种软件安装方式
  20. 迅控SVS为某公安局打造综合联动指挥中心及合成作战中心

热门文章

  1. C#调用BarTender 模板
  2. STM32之高级定时器
  3. Css-note:修改input文本框边框焦点样式笔记
  4. 【python学习】matplotlib绘制对数坐标图(保留原数值)
  5. Ubuntu下安装企业微信
  6. 微信公众号代运营注意!公众号营销内容有新要求!做好微信公众号运营,需要规避什么?
  7. 基于Python构建上市公司高送转预测模型
  8. LaTex公式编辑器
  9. 简单小项目:基于Mplayer的视频播放器(Linux)
  10. 池州学院计算机专业怎么样,2017池州学院专业排名情况