AVL树的插入操作(旋转)图解
AVL树的概念


AVL树的插入
- template<class K>
- struct AVLTreeNode
- {
- K _key;
- int _bf;
- AVLTreeNode<K, V>* _left;
- AVLTreeNode<K, V>* _right;
- AVLTreeNode<K, V>* _parent;
- AVLTreeNode(const K& key, const V& value)
- :_key(key),
- _bf(),
- _left(NULL),
- _right(NULL),
- _parent(NULL)
- {}
- };












程序代码:
- bool Insert(const K& key, const V& value)
- {
- if (_root == NULL)
- {
- _root = new Node(key, value);
- return true;
- }
- Node* pcur = _root;
- Node* parent = NULL;
- while (pcur)
- {
- if (pcur->_key == key)
- return false;
- else if (pcur->_key < key)
- {
- parent = pcur;
- pcur = pcur->_right;
- }
- else
- {
- parent = pcur;
- pcur = pcur->_left;
- }
- }
- if (parent->_key < key)
- {
- pcur = parent->_right = new Node(key, value);
- pcur->_parent = parent;
- }
- else
- {
- pcur = parent->_left = new Node(key, value);
- pcur->_parent = parent;
- }
- while (parent)
- {
- //修正平衡因子
- if (pcur == parent->_left)
- {
- parent->_bf--;
- }
- if (pcur == parent->_right)
- {
- parent->_bf++;
- }
- //
- if (parent->_bf == )
- break;
- else if (parent->_bf == - || parent->_bf == )
- {
- pcur = parent;
- parent = pcur->_parent;
- }
- else //parent->bf -2 || 2
- {
- if (parent->_bf == -)
- {
- if (pcur->_bf == -) //右单旋
- RotateR(parent);
- else //左右双旋
- RotateLR(parent);
- }
- else
- {
- if (pcur->_bf == ) //左单旋
- RotateL(parent);
- else //右左双旋
- RotateRL(parent);
- }
- break;
- }
- }
- return true;
- }
>>旋转
- void RotateR(Node* parent)
- {
- Node* subL = parent->_left;
- Node* subLR = subL->_right;
- //换指向
- parent->_left = subLR;
- subL->_right = parent;
- if (subLR)
- {
- subLR->_parent = parent;
- }
- Node* PParent = parent->_parent; //判断parent是否有父节点
- if (PParent)
- {
- if (parent == PParent->_left)
- {
- PParent->_left = subL;
- subL->_parent = PParent;
- }
- else
- {
- PParent->_right = subL;
- subL->_parent = PParent;
- }
- }
- else
- {
- _root = subL;
- subL->_parent = NULL;
- }
- parent->_parent = subL;
- //修改bf
- subL->_bf = ;
- parent->_bf = ;
- }
- //
- void RotateL(Node* parent)
- {
- Node* subR = parent->_right;
- Node* subRL = subR->_left;
- //调整指向
- subR->_left=parent;
- parent->_right = subRL;
- if (subRL) //如果subRL非空
- {
- subRL->_parent = parent;
- }
- Node* PPNode = parent->_parent;
- if (PPNode)
- {
- if (PPNode->_left == parent)
- PPNode->_left = subR;
- else
- PPNode->_right = subR;
- //subR的父节点改变
- subR->_parent = PPNode;
- }
- else
- {
- _root = subR; //根节点
- subR->_parent = NULL;
- }
- parent->_parent = subR;
- /*修改bf*/
- parent->_bf = subR->_bf = ;
- }
- //双旋(左右、、右左)
- void RotateRL(Node* parent)
- {
- Node* subR = parent->_right;
- Node* subRL = subR->_left;
- int bf = subRL->_bf;
- RotateR(parent->_right);
- RotateL(parent);
- //调整subR和parent的平衡因子
- if (bf == -)
- subR->_bf = ; // subR的bf在左旋中已经置0了,这里就没有再写
- else if (bf == )
- parent->_bf = -;
- else
- {
- parent->_bf = ;
- subRL->_bf = ;
- }
- }
- void RotateLR(Node* parent)
- {
- Node* subL = parent->_left;
- Node* subLR = subL->_right;
- int bf = subLR->_bf;
- RotateL(parent->_left);
- RotateR(parent);
- //调整parent和subL的平衡因子
- if (bf == -)
- parent->_bf = ; //subL的bf在左旋中已经置0了,这里就没有再写
- else if (bf == )
- subL->_bf = -; //parent的bf在左旋中已经置0了
- else
- {
- subL->_bf = ;
- parent = ;
- }
- }
AVL树的插入操作(旋转)图解的更多相关文章
- AVL树的插入和删除
一.AVL 树 在计算机科学中,AVL树是最早被发明的自平衡二叉查找树.在AVL树中,任一节点对应的两棵子树的最大高度差为 1,因此它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度 ...
- AVL 树的插入、删除、旋转归纳
参考链接: http://blog.csdn.net/gabriel1026/article/details/6311339 1126号注:先前有一个概念搞混了: 节点的深度 Depth 是指从根 ...
- AVL树的单双旋转操作
把必须重新平衡的节点称为å.对于二叉树,å的两棵子树的高度最多相差2,这种不平衡可能有四种情况: 对å的左儿子的左子树进行插入节点(左-左) 对å的左儿子的右子树进行插入节点(左-右) 对å的右儿子的 ...
- AVL树的插入删除查找算法实现和分析-1
至于什么是AVL树和AVL树的一些概念问题在这里就不多说了,下面是我写的代码,里面的注释非常详细地说明了实现的思想和方法. 因为在操作时真正需要的是子树高度的差,所以这里采用-1,0,1来表示左子树和 ...
- AVL树的插入与删除
AVL 树要在插入和删除结点后保持平衡,旋转操作必不可少.关键是理解什么时候应该左旋.右旋和双旋.在Youtube上看到一位老师的视频对这个概念讲解得非常清楚,再结合算法书和网络的博文,记录如下. 1 ...
- 第七章 二叉搜索树 (d2)AVL树:插入
- 创建AVL树,插入,删除,输出Kth Min
https://github.com/TouwaErioH/subjects/tree/master/C%2B%2B/PA2 没有考虑重复键,可以在结构体内加一个int times. 没有考虑删除不存 ...
- 数据结构--Avl树的创建,插入的递归版本和非递归版本,删除等操作
AVL树本质上还是一棵二叉搜索树,它的特点是: 1.本身首先是一棵二叉搜索树. 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值最多为1(空树的高度为-1). 也就是说,AVL树,本质上 ...
- AVL树(查找、插入、删除)——C语言
AVL树 平衡二叉查找树(Self-balancing binary search tree)又被称为AVL树(AVL树是根据它的发明者G. M. Adelson-Velskii和E. M. Land ...
随机推荐
- ES 基础
You Know, for Search 安装es时 , jdk最低版本需要 jdk7 默认端口 : 9200 启动后浏览器访问 : localhost:9200 角色关系对照 elasticsear ...
- 探索ORACLE之ASM概念
一. ASM(自动存储管理)的来由: ASM是Oracle 10g R2中为了简化Oracle数据库的管理而推出来的一项新功能,这是Oracle自己提供的卷管理器,主要用于替代操作系统所提供的 ...
- 转】Maven学习总结(四)——Maven核心概念
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4051819.html 感谢! 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中 ...
- SSH原理与运用一:远程登录(转)
原文:http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html 作者: 阮一峰 SSH是每一台Linux电脑的标准配置. 随着Linux ...
- 修改Map中确定key对应的value问题
今天在码代码的时候出现一个没有预料的问题: 先看下面的代码: public static void main(String[] args) { String[] files=new String[]{ ...
- 轻松学习 red5 教程 像视频一样很详细还有代码直接可Copy
转载自:http://blog.csdn.net/hongdianking/archive/2009/11/12/4804339.aspx 最近要做一个流媒体服务器,在网上逗留了好久决定选择 red5 ...
- CodeForces 455A Boredom (DP)
Boredom 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/G Description Alex doesn't like b ...
- jquery easyui防止超出浏览器边界
var easyuiPanelOnMove=function(left,top){ if(left<0){ $(this).window('move',{ left:1 }); } if(top ...
- POJ 2763 Housewife Wind (树链剖分 有修改单边权)
题目链接:http://poj.org/problem?id=2763 n个节点的树上知道了每条边权,然后有两种操作:0操作是输出 当前节点到 x节点的最短距离,并移动到 x 节点位置:1操作是第i条 ...
- JVM 关闭前执行命令的钩子
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { public void run() { System.out.prin ...