数据结构课件 ALV树的处理_第1页
数据结构课件 ALV树的处理_第2页
数据结构课件 ALV树的处理_第3页
数据结构课件 ALV树的处理_第4页
数据结构课件 ALV树的处理_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ALV树的处理

1.概述

AVL树是最早提出的自平衡二叉树,在AVL树中任何节点的两个子树的高度最大差别为一,所以

它也被称为高度平衡树。AVL树得名于它的发明者GM.Adelson-Velsky和E.M.Landis。AVL树种查

找、插入和删除在平均和最坏情况下都是。(logn),增加和删除可能需要通过一次或多次树旋转来重

新平衡这个树。本文介绍了AVL树的设计思想和基本操作。

2.基本术语

有四种种情况可能导致二叉查找树不平衡,分别为:

(1)LL:插入一个新节点到根节点的左子树(Left)的左子树(Left),导致根节点的平衡因子

由1变为2

(2)RR:插入•个新节点到根节点的右子树(Right)的右子树(Right),导致根节点的平衡因

子由-1变为-2

(3)LR:插入一个新节点到根节点的左子树(Left)的右子树(Right),导致根节点的平衡因子

由1变为2

(4)RL:插入一个新节点到根节点的右子树(Right)的左子树(Left),导致根节点的平衡因子

由-1变为-2

针对四种种情况可能导致的不平衡,可以通过旋转使之变平衡。有两种基本的旋转:

(1)左旋转:将根节点旋转到(根节点的)右孩子的左孩子位置

(2)右旋转:将根节点旋转到(根节点的)左孩子的右孩子位置

3.AVL树的旋转操作

AVL树的基本操作是旋转,有四种旋转方式,分别为:左旋转,右旋转,左右旋转(先左后右),

右左旋转(先右后左),实际上,这四种旋转操作两两对称,因而也可以说成两类旋转操作。

基本的数据结构:

1typedefstructNode*Tree;

2typedefstructNode*Node_t;

3typedefTypeint;

4

5structNode{

6Node_tleft;

7Node_tright;

8intheight;

9Typedata;

10};

11intHeight(Node_tnode){

12returnnode->height;

13)

3.1LL

LL情况需要右旋解决,如下图所示:

代码为:

1Node_tRightRotate(Node_ta){

2b=a->left;

3a->left=b->right;

4b->right=a;

5a->height=Max(Height(a->left),Height(a->right));

6b->height=Max(Height(b->left),Height(b->right));

7returnb;

8

3.2RR

RR情况需要左旋解决,如下图所示:

代码为:

1Node_tLeftRotate(Node_ta){

2b=a->right;

3a->right=b->left;

4b->left=a;

5a->height=Max(Height(a->left),Height(a->right));

6b->height=Max(Height(b->left),Height(b->right));

7returnb;

8}

3.3LR

LR情况需要左右(先B左旋转,后A右旋转)旋解决,如下图所示:

代码为:

1Node_tLeftRightRotate(Node_ta){

2a->left=LeftRotate(a->left);

3returnRightRotate(a);

4

3.4RL

RL情况需要右左旋解决(先B右旋转,后A左旋转),如下图所示:

代码为:

1Node_tRightLeftRotate(Node_ta){

2a->right=RightRotate(a->right);

3returnLeftRotate(a);

4)

4.AVL数的插入和删除操作

(1)插入操作:实际上就是在不同情况下采用不同的旋转方式调整整棵树,具体代码如下:

1Node_tInsert(Typex,Treet){

2if(t==NULL){

3t=NewNode(x);

4}elseif(x<t->data){

5t->left=Insert(t->left);

6if(Height(t->left)-Height(t->right)==2){

7if(x<t->left->data){

8t=RightRotate(t);

9}else{

10t=LeftRightRotate(t);

11)

12)

13}else{

14t->right=Insert(t->right);

15if(Height(t->right)-Height(t->left)==2){

16if(x>t->right->data){

17t=LeftRotate(t);

18}else{

19t=RightLeftRotate(t);

20}

21}

22)

23t->height=Max(Height(t->left),Height(t->right))+1;

24returnt;

25)

(2)删除操作:首先定位要删除的节点,然后用该节点的右孩子的最左孩子替换该节点,并重新调

整以该节点为根的子树为AVL树,具体调整方法跟插入数据类似,代码如下:

1Node_tDelete(Typex,Treet){

2if(t==NULL)returnNULL;

3if(t->data==x){

4if(t->right==NULL){

5Node_ttemp=t;

6t=t->left;

7free(temp);

8}else{

9Node_thead=t->right;

10while(head->left){

11head=head->left;

12)

13t->data=head->data;//justcopydata

14t->right=Delete(t->data,t->right);

15t->height=Max(Height(t->left),Height(t->right))+1;

16)

17returnt;

18}elseif(t->data<x){

19Delete(x,t->right);

20if(t->right)Rotate(x,t->right);

21}else{

22Delete(x,t->left);

23if(t->left)Rotate(x,t->left);

24)

25if(t)Rotate(x,t);

26)

5.总结

AVL树是最早的自平衡二叉树,相比于后来出现的平衡二叉树(红黑树,treap,splay树)而

言,它现在应用较少,但研究AVL树对于了解后面出现的常用平衡二叉树具有重要意义。

6.参考资料

(1)数据结构(C语言版)严蔚敏,吴伟民著

(2)/wiki/AVL%E6

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论