## 1.1 AVL 的旋转

### 1.1.5 Problem-Solution

LL问题，使用R旋转；

RR问题，使用L旋转；

LR问题，使用LR旋转(再次强调是先把R分支进行L旋转，再把L分支进行R旋转)

RL问题，使用RL旋转(再次强调是先把L分支进行R旋转，再把R分支进行L旋转)

## 1.2插入

```  struct AvlNode
{
ElementType Element;
AvlTree Left;
AvlTree Right;
int Height;
struct AvlNode()
{
Element = -1;
Left = NULL;
Right = NULL;
Height = 0;
}
};```

```AvlTree Insert(ElementType x, AvlTree T)
{
if (T == NULL)
{
//创建并返回一棵单结点的树
T = new AvlNode();
assert(T);
T->Element = x;
return T;
}
else if (x < T->Element)
{
T->Left = Insert(x, T->Left);
//调整最深的不平衡的结点
//高度不平衡时，该结点的两棵子树高度差为2
if (Height(T->Left) - Height(T->Right) == 2)
{
if (x < T->Left->Element)//Problem: LL->Solution:R
T = SingleRotateR(T);
else  //Problem: LR->Solution: LR
T = DoubleRotateLR(T);
}
}
else if (x > T->Element)
{
T->Right = Insert(x, T->Right);
if (Height(T->Right) - Height(T->Left) == 2)
{
if (x > T->Right->Element)//Problem: RR->Solution:L
T = SingleRotateL(T);
else//Problem: RL->Solution:RL
T = DoubleRotateRL(T);
}
}
T->Height = Max(Height(T->Left), Height(T->Right)) + 1;
return T;
}```

R旋转：

```Position SingleRotateR(Position k2)
{
Position k1;

k1 = k2->Left;
k2->Left = k1->Right;
k1->Right = k2;

k2->Height = Max(Height(k2->Left), Height(k2->Right)) + 1;
k1->Height = Max(Height(k1->Left), Height(k1->Right)) + 1;

//k1为新的根结点
return k1;
}
```

LR旋转：

```Position DoubleRotateLR(Position k3)
{
k3->Left = SingleRotateL(k3->Left);
return SingleRotateR(k3);
}
```

## 1.3 删除

AVL的删除和二叉搜索树的删除很像，多了平衡的操作。 这里贴出伪代码来理解，完整代码实现：https://github.com/yulifromchina/exercise/tree/master/algorithm/tree/avl%20tree。

```Delete(Tree, data)
{
if(data < Tree->data) Delete(Tree->left, data);balance(Tree);
else if(data > Tree->data) Delete(Tree->right,data);balance(Tree);
else
if(Tree->left && Tree->right)
replace Tree->data with successor or precursor;
Delete(Tree->right/left, successor/precursor);
balance(Tree);
else
if(Tree->left==NULL)
Tree = Tree->right;
else if(Tree->right==NULL)
Tree = Tree->left;
free(Tree's origin memory)
update(Tree's Height)
}```

## 1.4 参考

1. Youtebu视频：Basics of AVL tree.
2. 《数据结构与算法分析：C语言描述》

3. 一步一步写平衡二叉树（AVL树）

(完)

## AVL树的插入与删除的更多相关文章

1. AVL 树的插入、删除、旋转归纳

参考链接: http://blog.csdn.net/gabriel1026/article/details/6311339   1126号注:先前有一个概念搞混了: 节点的深度 Depth 是指从根 ...

2. AVL树的插入操作（旋转）图解

=================================================================== AVL树的概念       在说AVL树的概念之前,我们需要清楚 ...

3. B树和B+树的插入、删除图文详解

简介:本文主要介绍了B树和B+树的插入.删除操作.写这篇博客的目的是发现没有相关博客以举例的方式详细介绍B+树的相关操作,由于自身对某些细节也感到很迷惑,通过查阅相关资料,对B+树的操作有所顿悟,写下 ...

4. B树和B+树的插入、删除图文详解（good）

B树和B+树的插入.删除图文详解 1. B树 1. B树的定义 B树也称B-树,它是一颗多路平衡查找树.我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数 ...

5. AVL树的插入删除查找算法实现和分析-1

至于什么是AVL树和AVL树的一些概念问题在这里就不多说了,下面是我写的代码,里面的注释非常详细地说明了实现的思想和方法. 因为在操作时真正需要的是子树高度的差,所以这里采用-1,0,1来表示左子树和 ...

6. B+树的插入、删除（附源代码）

B+ Tree Index B+树的插入 B+树的删除 完整测试代码 Basic B+树和B树类似(有关B树:http://www.cnblogs.com/YuNanlong/p/6354029.ht ...

7. MySQL B+树 的插入与删除

一.MySQL Index 的插入 有如下B+树,其高度为2,每页可存放4条记录,扇出为5.所有记录都在叶子节点上, 并且是顺序存放,如果用户从最左边的叶子节点开始顺序遍历,可以得到所有简直的顺序 排 ...

8. 转：B树和B+树的插入、删除图文详解

如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. B树 1. B树的定义 B树也称B-树,它是一颗多路平衡查找树.我们描述一颗B树时需要指定它的阶数,阶数表示了 ...

9. trie树---（插入、删除、查询字符串）

HDU   5687 Problem Description 度熊手上有一本神奇的字典,你可以在它里面做如下三个操作:  1.insert : 往神奇字典中插入一个单词  2.delete: 在神奇字 ...

## 随机推荐

1. TODO：搭建Laravel VueJS SemanticUI

TODO:搭建Laravel VueJS SemanticUI Laravel是一套简洁.优雅的PHP开发框架(PHP Web Framework).可以让你从面条一样杂乱的代码中解脱出来:它可以帮你 ...

2. 番外特别篇之 为什么我不建议你直接使用UIImage传值?--从一个诡异的相册九图连读崩溃bug谈起

关于"番外特别篇" 所谓"番外特别篇",就是系列文章更新期间内,随机插入的一篇文章.目前我正在更新的系列文章是 实现iOS图片等资源文件的热更新化.但是,这两天 ...

3. 与Java Web Service相关的若干概念（JAX-WS,JAX-RS）

WS ,JAX-WS ,JAX-RS,REST,Restlet,SOAP l  JWS: 是指与webservice相关的J2EE(其实现在应该叫做Java EE吧)技术叫做 JWS(全称就是 jav ...

4. 数据结构（树，点分治）：POJ 1741 Tree

Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). D ...

5. springMVC 中的restful 架构风格

RESTful架构 : 是一种设计的风格,并不是标准,只是提供了一组设计原则和约束条件,也是目前比较流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所以正得到越来越多网站的采用. ...

6. vue 学习笔记（二）

最近公司赶项目,一直也没时间看 vue,之前看下的都快忘得差不多了.哈哈哈,来一起回顾一下vue 学习笔记(一)后,继续向下看嘛. #表单输入绑定 基础用法 v-model 会忽略所有表单元素的 va ...

7. 直接插入排序算法的C++实现

直接插入算法:每趟将一个待排序的关键字按照其值的大小插入到已经排好的部分有序序列的适当位置上,直到所有待排序的关键字都被插入到有序序列中为止. 理论上,在直接插入排序中第二层循环是可以提前结束的,即某 ...

8. FCoin优势

FCoin优势 顶级技术金融级别的速度和稳定,交易高效有保障:国际顶尖团队自主研发撮合系统,能够每秒处理200万笔交易:证券级先进算法,支持GTT.GTC.FOK.IOC等多种专业交易指令,为交易者提 ...

9. Oracle数据库日期格式转换操作

1. 日期转化为字符串 (以2016年10月20日为例) select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')  strDateTime from dual; ...

10. bzoj3495

题解: 对于每一条边的两段都有,很简单 然后处理国家 容易发现前缀和为1 代码: #include<cstdio> #include<algorithm> using name ...