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. Android Studio查看应用数字签名-android学习之旅(76)

    Android Studio和Eclispe还是有比较大的区别,在这地方,eclipse可以直接在设置里面,而AS就需要通过Terminal来查看 步骤 1.首先定位到.android 一般都是在C盘 ...

  2. ECMAScript 6之变量的解构赋值

    1,数组的解构赋值 基本用法 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前,为变量赋值,只能直接指定值. var a = 1; va ...

  3. Spring揭秘读书笔记 八 数据访问异常体系

    这篇博客 来自spring揭秘一书的第十三章 为什么要有访问异常都有一个体系,这个我们得从DAO模式说起. DAO模式 任何一个系统,不管是一个最简单的小系统,还是大规模的系统,都得跟数据打交道,说白 ...

  4. 最新的App上架教程Object-C

    准备 开发者账号 完工的项目 上架步骤 一.创建App ID 二.创建证书请求文件 (CSR文件) 三.创建发布证书 (CER) 四.创建Provisioning Profiles配置文件 (PP文件 ...

  5. Java实现附近地点搜索

    Java,Mysql-根据一个给定经纬度的点,进行附近500米地点查询–合理利用算法 最近做一个项目:需要查询一个站点(已知该站点经纬度)1km-10km范围内的其它站点.所以,我首先想到的是,对每条 ...

  6. 网站论坛同步用户,整合api,实现…

    在网上参考了很多资料后,终于完美实现了网站和discuz!nt论坛的双向整合,整合后网站和论坛之间可以同步注册.登录.退出和修改登录密码操作. 本系统的实现形式是新云CMS网站(ASP)和Discuz ...

  7. 网站开发进阶(二十一)Angular项目信息错位显示问题解决

    Angular项目信息错位显示问题解决 绪 最近在项目开发过程中遇到这样一个棘手的问题:查询出所有订单信息后,点击选择某一个订单,查询出的结果是上一次查询所得的结果.而且会出现点击两次才可以显示订单详 ...

  8. 【一天一道LeetCode】#6 ZigZag Conversion

    一天一道LeetCode系列 (一)题目 The string "PAYPALISHIRING" is written in a zigzag pattern on a given ...

  9. Android Hal 分析

    本文是基于android4.0.3.对应其他低版本的代码,可能有所差异,但基本大同小异. Android的HAL是为了保护一些硬件提供商的知识产权而提出的,是为了避开linux的GPL束缚.思路是把控 ...

  10. DiskLruCache硬盘缓存技术详解

    上次讲了使用内存缓存LruCache去加载很多图片而不造成OOM,而这种缓存的特点是在应用程序运行时管理内存中的资源(图片)的存储和释放,如果LruCache中有一张图片被释放了,再次加载该图片时需要 ...