1.AVL树是带有平衡条件的二叉查找树, 一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树。

2.AVL树的删除要比插入复杂。如果删除相对较少,那么用懒惰删除的方法是最好的策略。

3.AVL树的插入操作:

 #ifndef  _AvlTree_H
struct AvlNode;
typedef struct AvlNode *Position;
typedef struct AvlNode *AvlTree;
typedef ElementType int;
AvlTree Insert(ElmentType X,AvlTree T);
AvlTree MakeEmpty(AvlTree T);
Position Find(ElementType X,AvlTree T);
Position FindMax(AvlTree T);
Position FindMin(AvlTree T);
AvlTree Delete(ElementType X,AvlTree T);
ElementType Retrieve(Position P);
#endif;
struct AvlNode //定义一个树结构,包含了树的高度
{
ElementType Element;
AvlTree Left;
AvlTree Right;
int Height;
};
int Height(Position P) //取得树的高
{
if(P==NULL)
return -;
else
return P->Height; }
int Max(AvlTree T1, AvlTree T2) //获得大值
{
if(T1->Height>T2->Height)
return T1->Height;
else
return T2->Height;
} AvlTree Insert(ElmentType x,AvlTree T) // 树的插入
{
if(T==NULL)
{
T=new AvlTree();
T->Element=x;
T->Left=NULL;
T->Right=NULL;
T->Height=;
}
else if(x<T->Element) //插入到当前树的左子树中
{
T->Left=Insert(x,T->Left);
if(Height(T->Left)-Height(T->Right)==)//如果树不平衡
{
if(x<T->Left->Element) //左左插入只需要进行单旋转
T=SingleRotateWithLeft(T);
else //左右插入需要进行双旋转,单旋转不能改变去不平衡的状态
T=DoubleRotateWithLeft(T);
}
}
else if(x>T->Element)//插入到当前树的右子树中
{
T->Right=Insert(x,T->Right);
if(Height(T->Right)-Height(T->Left)==)
{
if(x>T->Right->Element) //右右插入只需要进行单旋转
T=SingleRotateWithRight(T);
else //右左插入需要进行双旋转,单旋转不能改变去不平衡的状态
T=DoubleRotateWithRight(T);
}
}
else{cout<<"error:不能插入相同的树结点"};
T->Height=Max(Height(T->Left),Height(T->Right))+;
return T;
} Position singleRotateWithLeft(Position K2)//左左单旋
{
Position K1;
K1=K2->Left;
K2->Left=K1->Right;
K1->Right=K2;
K2->Height=Max(Height(K2->Left),Height(K2->Right))+;
K1->Height=Max(Height(K1->Left),Height(K1->Right))+;
return K1;
}
Position singleRotateWithRight(Position K2)//右右单旋
{
Position K1;
K1=K2->Right;
K2->Right=K1->Left;
K1->Left=K2;
K2->Height=Max(Height(K2->Left),Height(K2->Right)+;
K1->Height=Max(Height(K1->Left),Height(K1->Right))+;
return K1;
}
Position DoubleRotateWithLeft(Position K3)//左右双旋
{
Position K1,K2;
K2=K3->Left;
K1=K2->Right;
k2->Right=K1->Left;
K3->Left=K1->Right;
K1->Left=K2;
K1->Right=K3; K1->Height=Max(Height(K1->Left),Height(K1->Right))+;
K2->Height=Max(Height(K2->Left),Height(K2->Right)+;
K3->Height=Max(Height(K3->Left),Height(K3->Right)+; } Position DoubleRotateWithRight(Position K3)//右左双旋
{
//Rotate between k1 and K2;
K3->Right=singleRotateWithLeft(K3->Right);
//Rotate between k2 and k3;
return singleRotateWithRight(K3); }

AVL Tree 操作的更多相关文章

  1. 04-树5 Root of AVL Tree + AVL树操作集

    平衡二叉树-课程视频 An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the tw ...

  2. 树的平衡 AVL Tree

    本篇随笔主要从以下三个方面介绍树的平衡: 1):BST不平衡问题 2):BST 旋转 3):AVL Tree 一:BST不平衡问题的解析 之前有提过普通BST的一些一些缺点,例如BST的高度是介于lg ...

  3. A1066. Root of AVL Tree

    An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...

  4. PAT 1066 Root of AVL Tree[AVL树][难]

    1066 Root of AVL Tree (25)(25 分) An AVL tree is a self-balancing binary search tree. In an AVL tree, ...

  5. PTA (Advanced Level) 1066 Root of AVL Tree

    Root of AVL Tree An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of ...

  6. 平衡二叉树(AVL Tree)

    在学习算法的过程中,二叉平衡树是一定会碰到的,这篇博文尽可能简明易懂的介绍下二叉树的相关概念,然后着重讲下什么事平衡二叉树. (由于作图的时候忽略了箭头的问题,正常的树一般没有箭头,虽然不影响描述的过 ...

  7. PAT甲级——1123 Is It a Complete AVL Tree (完全AVL树的判断)

    嫌排版乱的话可以移步我的CSDN:https://blog.csdn.net/weixin_44385565/article/details/89390802 An AVL tree is a sel ...

  8. PTA 04-树5 Root of AVL Tree (25分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/668 5-6 Root of AVL Tree   (25分) An AVL tree ...

  9. 转载:平衡二叉树(AVL Tree)

    平衡二叉树(AVL Tree) 转载至:https://www.cnblogs.com/jielongAI/p/9565776.html 在学习算法的过程中,二叉平衡树是一定会碰到的,这篇博文尽可能简 ...

随机推荐

  1. 20_Android中apk安装器,通过WebView来load进一个页面,Android通知,程序退出自动杀死进程,通过输入包名的方式杀死进程

     场景:实现安装一个apk应用程序的过程.界面如下: 编写如下应用,应用结构如下: <RelativeLayout   编写activity_main.xml布局: <Relative ...

  2. PYTHON风格规范-Google 开源项目风格指南

    Python风格规范 分号 Tip 不要在行尾加分号, 也不要用分号将两条命令放在同一行. 行长度 Tip 每行不超过80个字符 例外: 长的导入模块语句 注释里的URL 不要使用反斜杠连接行. Py ...

  3. 【重构】 代码的坏味道总结 Bad Smell (一) (重复代码 | 过长函数 | 过大的类 | 过长参数列 | 发散式变化 | 霰弹式修改)

    膜拜下 Martin Fowler 大神 , 开始学习 圣经 重构-改善既有代码设计 . 代码的坏味道就意味着需要重构, 对代码的坏味道了然于心是重构的比要前提; . 作者 : 万境绝尘 转载请注明出 ...

  4. 网站开发进阶(二十六)js刷新页面方法大全

    js刷新页面方法大全 在项目开发过程中,需要实现刷新页面.经过学习,发现下面这条语句就可以轻松实现. location.reload(); // 刷新页面 有关刷新页面的其它方法,具体学习内容如下,有 ...

  5. 【matlab编程】Matlab版扫雷

    我发现有些人平常闲着的时候会玩window自带的游戏,其中最常见的就是扫雷和纸牌.本来想用matlab编写全自动扫雷程序用来作弊,可是后来发现扫雷问题是NP完全问题(正如:旅行商NP难问题一样不能被解 ...

  6. Linux内核中SPI总线驱动分析

    本文主要有两个大的模块:一个是SPI总线驱动的分析 (研究了具体实现的过程): 另一个是SPI总线驱动的编写(不用研究具体的实现过程). 1 SPI概述 SPI是英语Serial Peripheral ...

  7. 【Java编程】Java学习笔记<二>

    种访问权限,而类的访问控制级别只有public和缺省的,当为public时,可以被任何包的其他类访问,当为缺省时,只能被同一包的其他类访问.如果类自身对另一个类是不可见的,即使类的成员声明为publi ...

  8. PS图层混合算法之四(亮光, 点光, 线性光, 实色混合)

    亮光模式: 根据绘图色通过增加或降低"对比度",加深或减淡颜色.如果绘图色比50%的灰亮,图像通过降低对比度被照亮,如果绘图色比50%的灰暗,图像通过增加对比度变暗. 线性光模式: ...

  9. 设置布局默认为LinearLayout,却成了RelativeLayout

    GoogleXML布局文件前推荐布局LinearLayout新建布局XML文件根元素LinearLayout, 随着android发展工程师更推荐使用RelativeLayout布局式所新建XML布局 ...

  10. 关于C++“加、减机制”的整理

    今天上C++的课,杨老师提到C++继承是“加机制”的,而没有像人类进化一样采取的是“减机制”,这样会导致代码的膨胀和冗余.回来后,特地查阅了一下资料,发现这方面的文章很少. 下边的资料摘自网上及杨老师 ...