AVL Tree 操作
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 操作的更多相关文章
- 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 ...
- 树的平衡 AVL Tree
本篇随笔主要从以下三个方面介绍树的平衡: 1):BST不平衡问题 2):BST 旋转 3):AVL Tree 一:BST不平衡问题的解析 之前有提过普通BST的一些一些缺点,例如BST的高度是介于lg ...
- 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 ...
- 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, ...
- 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 ...
- 平衡二叉树(AVL Tree)
在学习算法的过程中,二叉平衡树是一定会碰到的,这篇博文尽可能简明易懂的介绍下二叉树的相关概念,然后着重讲下什么事平衡二叉树. (由于作图的时候忽略了箭头的问题,正常的树一般没有箭头,虽然不影响描述的过 ...
- 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 ...
- 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 ...
- 转载:平衡二叉树(AVL Tree)
平衡二叉树(AVL Tree) 转载至:https://www.cnblogs.com/jielongAI/p/9565776.html 在学习算法的过程中,二叉平衡树是一定会碰到的,这篇博文尽可能简 ...
随机推荐
- MySql my.ini 中文详细说明
[mysqld] port = 3306 socket = /tmp/mysql.sock # 设置mysql的安装目录 basedir=F:\\Hzq Soft\ ...
- C++ 仿函数/函数指针/闭包lambda
在上一篇文章中介绍了C++11新引入的lambda表达式(C++支持闭包的实现),现在我们看一下lambda的出现对于我们编程习惯的影响,毕竟,C++11历经10年磨砺,出140新feature,对于 ...
- (NO.00001)iOS游戏SpeedBoy Lite成形记(二十)
下面修改最为关键的matchRun方法里的代码: CCActionCallBlock *blk = [CCActionCallBlock actionWithBlock:^{ _finishedCou ...
- java容易混淆的15个知识点
java知识点不多,但是有一些经常会被我们忽略 1.java是强类型的语言,数组也是对象,一旦确定数组的类型,里面就只能存放一个类型的数据. 2.新建的对象都被存放到堆上,如果没有引用,会很快垃圾回收 ...
- Unity访问Access数据库
首先,准备工作: 创建一个Access 数据库,命名AccessTest.accdb,添加一些数据用于测试 准备System.Data.dll与System.EnterpriseServices.dl ...
- 一个小公式帮你轻松将IP地址从10进制转到2进制
网络工程师经常会遇到的一个职业问题:如何分配IP,通过子网如何捕捉某一网段或某台机器?他们甚至能够进行精准的分析和复杂的开发......凡此种种,其实与一些他们头脑中根深蒂固的常识性理论存有某种内在的 ...
- Cocos2D中的ObjectAL简介
Cocos2D包含ObjectAL音频库,可以回放音效和音乐. ObjectAL是一个建立在低级别OpenAL API上的库.OpenAL最擅长被用来播放短的音效(.wav,.caf,.aiff),并 ...
- BMP 转 YUV (BMP2YUV)
本文介绍BMP 转 YUV.其实这是以前"数据压缩"实验课上的内容,前几天有人问我相关的问题,突然发现自己有一段时间没有接触BMP也有些生疏了,因此翻出资料总结一下. BMP文件格 ...
- 内核调试神器SystemTap — 探测点与语法(二)
a linux trace/probe tool. 官网:https://sourceware.org/systemtap/ 探测点 SystemTap脚本主要是由探测点和探测点处理函数组成的,来看下 ...
- 面试之路(7)-BAT面试题之计算机的三大原则
1.计算机是执行输入.运算.输出的机器 计 算 机 的 硬 件 由 大 量 的 IC(Integrated Circuit,集成电路)组成.每块 IC 上都带有许多引脚.这些引脚有的用于输入,有的用于 ...