AVL树二叉查找树的一种,所以其操作和二叉查找树的很多操作是相同的。

1.

 1 #ifndef AVLTREE_H
 2 #define AVLTREE_H
 3
 4 struct AvlNode;
 5 typedef struct AvlNode *Position;
 6 typedef struct AvlNode *AvlTree;
 7
 8 typedef int ElementType;
 9
10
11 AvlTree MakeEmpty( AvlTree T );
12 Position Find( ElementType X, AvlTree T );
13 Position FindMin( AvlTree T );
14 Position FindMax( AvlTree T );
15 AvlTree Insert( ElementType X, AvlTree T );
16 AvlTree Delete( ElementType X, AvlTree T );
17 ElementType Retrieve( Position P );
18
19 #endif 

avltree.h

2.

  1 #include "avltree.h"
  2 #include <stdlib.h>
  3 #include "fatal.h"
  4
  5 struct AvlNode  {
  6     ElementType Element;
  7     AvlTree  Left;
  8     AvlTree  Right;
  9     int      Height;
 10 };
 11
 12 AvlTree  MakeEmpty( AvlTree T )   {
 13     if( T != NULL )
 14     {
 15         MakeEmpty( T->Left );
 16         MakeEmpty( T->Right );
 17         free( T );
 18     }
 19     return NULL;
 20 }
 21
 22 Position  Find( ElementType X, AvlTree T )  {
 23     if( T == NULL )
 24         return NULL;
 25     if( X < T->Element )
 26         return Find( X, T->Left );
 27     else if( X > T->Element )
 28         return Find( X, T->Right );
 29     else
 30         return T;
 31 }
 32
 33 Position  FindMin( AvlTree T )  {
 34     if( T == NULL )
 35         return NULL;
 36     else if( T->Left == NULL )
 37         return T;
 38     else return FindMin( T->Left );
 39 }
 40
 41 Position  FindMax( AvlTree T )  {
 42     if( T != NULL )
 43         while( T->Right != NULL )
 44             T = T->Right;
 45
 46     return T;
 47 }
 48
 49 /* START: fig4_36.txt */
 50 static int  Height( Position P )  {
 51     if( P == NULL )
 52         return -1;
 53     else
 54         return P->Height;
 55 }
 56 /* END */
 57
 58 static int  Max( int Lhs, int Rhs )  {
 59     return Lhs > Rhs ? Lhs : Rhs;
 60 }
 61
 62 /* START: fig4_39.txt */
 63 /* This function can be called only if K2 has a left child K1 */
 64 /* Perform a rotate between a node (K2) and its left child */
 65 /* Update heights, then return new root k1*/
 66
 67 static Position
 68 SingleRotateWithLeft( Position K2 )  {
 69     Position K1;
 70
 71     K1 = K2->Left;
 72     K2->Left = K1->Right;
 73     K1->Right = K2;
 74
 75     K2->Height = Max( Height( K2->Left ), Height( K2->Right ) ) + 1;
 76     K1->Height = Max( Height( K1->Left ), K2->Height ) + 1;
 77
 78     return K1;  /* New root */
 79 }
 80 /* END */
 81
 82 /* This function can be called only if K1 has a right child */
 83 /* Perform a rotate between a node (K1) and its right child */
 84 /* Update heights, then return new root */
 85
 86 static Position  SingleRotateWithRight( Position K1 )  {
 87     Position K2;
 88
 89     K2 = K1->Right;
 90     K1->Right = K2->Left;
 91     K2->Left = K1;
 92
 93     K1->Height = Max( Height( K1->Left ), Height( K1->Right ) ) + 1;
 94     K2->Height = Max( Height( K2->Right ), K1->Height ) + 1;
 95
 96     return K2;  /* New root */
 97 }
 98
 99 /* START: fig4_41.txt */
100 /* This function can be called only if K3 has a left */
101 /* child and K3's left child has a right child */
102 /* Do the left-right double rotation */
103 /* Update heights, then return new root */
104
105 static Position  DoubleRotateWithLeft( Position K3 )   {
106     /* Rotate between K1 and K2 */
107     K3->Left = SingleRotateWithRight( K3->Left );
108
109     /* Rotate between K3 and K2 */
110     return SingleRotateWithLeft( K3 );
111 }
112 /* END */
113
114 /* This function can be called only if K1 has a right */
115 /* child and K1's right child has a left child */
116 /* Do the right-left double rotation */
117 /* Update heights, then return new root */
118
119 static Position  DoubleRotateWithRight( Position K1 )    {
120     /* Rotate between K3 and K2 */
121     K1->Right = SingleRotateWithLeft( K1->Right );
122
123     /* Rotate between K1 and K2 */
124     return SingleRotateWithRight( K1 );
125 }
126
127
128 AvlTree  Insert( ElementType X, AvlTree T )  {
129     if( T == NULL )  {
130         T = malloc( sizeof( struct AvlNode ) );
131         if( T == NULL )
132             FatalError( "Out of space!!!" );
133         else     {
134             T->Element = X; T->Height = 0;
135             T->Left = T->Right = NULL;
136         }
137     }
138     else  if(X < T->Element )  {
139         T->Left = Insert( X, T->Left );
140         if( Height( T->Left ) - Height( T->Right ) == 2 )
141             if( X < T->Left->Element )
142                 T = SingleRotateWithLeft( T );
143             else
144                 T = DoubleRotateWithLeft( T );
145     }
146     else  if( X > T->Element )    {
147         T->Right = Insert( X, T->Right );
148         if( Height( T->Right ) - Height( T->Left ) == 2 )
149             if( X > T->Right->Element )
150                 T = SingleRotateWithRight( T );
151             else
152                 T = DoubleRotateWithRight( T );
153     }
154     T->Height = Max( Height( T->Left ), Height( T->Right ) ) + 1;
155     return T;
156 }
157
158 AvlTree    Delete( ElementType X, AvlTree T )  {
159     printf( "Sorry; Delete is unimplemented; %d remains\n", X );
160     return T;
161 }
162
163 ElementType Retrieve( Position P )  {
164     return P->Element;
165 }

avltree.c

3.

 1 #include "avltree.c"
 2 #include <stdio.h>
 3
 4 void PrintTree( AvlTree T)  {
 5     if (T != NULL) {
 6         PrintTree (T -> Left);
 7     printf    ("%d\n",Retrieve (T));
 8         PrintTree (T -> Right);
 9     }
10 }
11
12
13 int main(int argc, char *argv[])  {
14     AvlTree T;
15     Position P;
16     int i;
17     int j = 0;
18
19     T = MakeEmpty( NULL );
20     for( i = 0; i < 50; i += 5 )
21         T = Insert( i, T );
22     /*for( i = 0; i < 50; i++ )*/
23         /*if( ( P = Find( i, T ) ) == NULL || Retrieve( P ) != i )*/
24            /*printf( "Error at %d\n", i );*/
25
26  /* for( i = 0; i < 50; i += 2 )
27         T = Delete( i, T );
28
29     for( i = 1; i < 50; i += 2 )
30         if( ( P = Find( i, T ) ) == NULL || Retrieve( P ) != i )
31             printf( "Error at %d\n", i );
32     for( i = 0; i < 50; i += 2 )
33         if( ( P = Find( i, T ) ) != NULL )
34             printf( "Error at %d\n", i );
35 */
36         PrintTree (T);
37
38     printf( "Min is %d, Max is %d\n", Retrieve( FindMin( T ) ),
39                Retrieve( FindMax( T ) ) );
40
41     return 0;
42 }

testavl.c

转载于:https://www.cnblogs.com/hanxinle/p/7486134.html

算法(6) —— AVL树相关推荐

  1. 【从蛋壳到满天飞】JS 数据结构解析和算法实现-AVL树(一)

    前言 [从蛋壳到满天飞]JS 数据结构解析和算法实现,全部文章大概的内容如下: Arrays(数组).Stacks(栈).Queues(队列).LinkedList(链表).Recursion(递归思 ...

  2. 【数据结构与算法】AVL树的Java实现

    前情提要 之前只写了一些AVL树核心算法,这里给出一个AVL树的完整实现. AVL树是平衡查找二叉树,不仅能避免二叉搜索树出现斜树的状况,更是能保持比较标准的O(log2N),但AVL树可能需要很多次 ...

  3. 算法 二叉树 AVL树

    AVL树 AVL树的定义 结点的平衡因子 balance AVL树的结构 AVL树的插入 平衡化旋转 左单旋转 右单旋转 左双旋转 插入 insert AVL 树的删除 AVL树的定义 一颗AVL树或 ...

  4. 【数据结构与算法】AVL树核心算法的Java实现

    定义AVL树结点 public class AvlNode<T> {/*** 数据元素*/T element;/*** 结点高度*/int height;/*** 结点左儿子*/AvlNo ...

  5. DSA 经典数据结构与算法 学习心得和知识总结(四) | AVL树

    AVL树 从BST的角度看AVL AVL的定义及性质 AVL树的结构定义 AVL树的旋转算法 左左情况---右旋 右右情况---左旋 左右情况---左右旋 右左情况---右左旋 AVL树的遍历操作 A ...

  6. 数据结构与算法——AVL树类的C++实现

    关于AVL树的简单介绍能够參考: 数据结构与算法--AVL树简单介绍 关于二叉搜索树(也称为二叉查找树)能够參考:数据结构与算法--二叉查找树类的C++实现 AVL-tree是一个"加上了额 ...

  7. 数据结构与算法——二叉平衡树(AVL树)详解

    文章目录 AVL树概念 不平衡概况 四种平衡旋转方式 RR平衡旋转(左单旋转) LL平衡旋转(右单旋转) RL平衡旋转(先右后左双旋转) LR平衡旋转(先左后右单旋转) java代码实现 总结 AVL ...

  8. 高级数据结构与算法 | AVL树 (高度平衡树)

    文章目录 AVL树 实现思路 数据结构 查找 平衡因子 旋转 右旋 左旋 右左双旋 左右双旋 插入 删除 AVL树的验证 中序遍历 平衡判断 AVL树的性能 完整代码实现 AVL树 AVL树是最先发明 ...

  9. 数据结构与算法--面试必问AVL树原理及实现

    数据结构与算法–AVL树原理及实现 AVL(Adelson-Velskii 和landis)树是带有平衡条件的二叉查找树,这个平衡条件必须容易实现,并且保证树的深度必须是O(logN).因此我们让一棵 ...

  10. 【算法导论】 二叉搜索树、AVL树、和红黑树

    二叉搜索树 二叉搜索树是一颗二叉树或一颗空树且满足以下性质: 1)根节点 x的key值大于任意左子树上节点的key值,小于右子树上任意节点的key值 : 2)其左右子树也分别是一颗二叉搜索树. 使用二 ...

最新文章

  1. mysql的电话面试题_以往百度电话面试题
  2. gif透明背景动画_常用GIF动图制作工具,抖音里面的动图都是这些工具做出来的...
  3. abstract class和interface有什么区别
  4. 深入浅出计算机组成原理03:处理器
  5. 9大门类,99个系列课程,几乎所有AI免费课程都在这里啦
  6. send的内容ajax,Ajax中send方法的使用
  7. 广工大第12届ACM校赛A
  8. 神经网络 异或_深度学习入门笔记(2)线性神经网络
  9. 天翼空间应用商城 App Market体验
  10. SaltStack之state.sls
  11. django 模型-----模型查询
  12. MVC三层架构详细图
  13. Panel 控件概述(Windows 窗体)
  14. python答辩毕设ppt_毕设答辩ppt总结
  15. Element表格固定第一列和第一行,并通过属性名动态渲染数据
  16. 【智能工厂】智能工厂4.0:数字世界和物理世界的融合
  17. openofficeV2.0由SUN开发的一款免费不亚于微软的office软件
  18. Zookeeper连接异常 Got ping response for sessionid 2021-06-30
  19. Java IO BIO NIO
  20. 视频播放不流畅怎么办?使用CDN加速一步搞定!

热门文章

  1. AJAX初探,XMLHttpRequest介绍
  2. 使用ArcGIS API for Silverlight实现地形坡度在线分析
  3. 模块化、层次化网络监控平台
  4. ADO.NET Data Services Framework 基础概述
  5. 解决 drupal8 提示“ settings.php ”设置未配置 问题
  6. 部署SCCM2012之先决条件准备
  7. Kotlin项目实践指南(上)
  8. 围观阿里云最会赚钱的人!价值2万元邀请码不限量发送
  9. org.springframework.data.mapping.PropertyReferenceException: No property xxxx found for type Xxxx
  10. 第一次使用MsChart运行提示:ChartImg.axd 执行子请求时出错。