算法(6) —— AVL树
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树相关推荐
- 【从蛋壳到满天飞】JS 数据结构解析和算法实现-AVL树(一)
前言 [从蛋壳到满天飞]JS 数据结构解析和算法实现,全部文章大概的内容如下: Arrays(数组).Stacks(栈).Queues(队列).LinkedList(链表).Recursion(递归思 ...
- 【数据结构与算法】AVL树的Java实现
前情提要 之前只写了一些AVL树核心算法,这里给出一个AVL树的完整实现. AVL树是平衡查找二叉树,不仅能避免二叉搜索树出现斜树的状况,更是能保持比较标准的O(log2N),但AVL树可能需要很多次 ...
- 算法 二叉树 AVL树
AVL树 AVL树的定义 结点的平衡因子 balance AVL树的结构 AVL树的插入 平衡化旋转 左单旋转 右单旋转 左双旋转 插入 insert AVL 树的删除 AVL树的定义 一颗AVL树或 ...
- 【数据结构与算法】AVL树核心算法的Java实现
定义AVL树结点 public class AvlNode<T> {/*** 数据元素*/T element;/*** 结点高度*/int height;/*** 结点左儿子*/AvlNo ...
- DSA 经典数据结构与算法 学习心得和知识总结(四) | AVL树
AVL树 从BST的角度看AVL AVL的定义及性质 AVL树的结构定义 AVL树的旋转算法 左左情况---右旋 右右情况---左旋 左右情况---左右旋 右左情况---右左旋 AVL树的遍历操作 A ...
- 数据结构与算法——AVL树类的C++实现
关于AVL树的简单介绍能够參考: 数据结构与算法--AVL树简单介绍 关于二叉搜索树(也称为二叉查找树)能够參考:数据结构与算法--二叉查找树类的C++实现 AVL-tree是一个"加上了额 ...
- 数据结构与算法——二叉平衡树(AVL树)详解
文章目录 AVL树概念 不平衡概况 四种平衡旋转方式 RR平衡旋转(左单旋转) LL平衡旋转(右单旋转) RL平衡旋转(先右后左双旋转) LR平衡旋转(先左后右单旋转) java代码实现 总结 AVL ...
- 高级数据结构与算法 | AVL树 (高度平衡树)
文章目录 AVL树 实现思路 数据结构 查找 平衡因子 旋转 右旋 左旋 右左双旋 左右双旋 插入 删除 AVL树的验证 中序遍历 平衡判断 AVL树的性能 完整代码实现 AVL树 AVL树是最先发明 ...
- 数据结构与算法--面试必问AVL树原理及实现
数据结构与算法–AVL树原理及实现 AVL(Adelson-Velskii 和landis)树是带有平衡条件的二叉查找树,这个平衡条件必须容易实现,并且保证树的深度必须是O(logN).因此我们让一棵 ...
- 【算法导论】 二叉搜索树、AVL树、和红黑树
二叉搜索树 二叉搜索树是一颗二叉树或一颗空树且满足以下性质: 1)根节点 x的key值大于任意左子树上节点的key值,小于右子树上任意节点的key值 : 2)其左右子树也分别是一颗二叉搜索树. 使用二 ...
最新文章
- mysql的电话面试题_以往百度电话面试题
- gif透明背景动画_常用GIF动图制作工具,抖音里面的动图都是这些工具做出来的...
- abstract class和interface有什么区别
- 深入浅出计算机组成原理03:处理器
- 9大门类,99个系列课程,几乎所有AI免费课程都在这里啦
- send的内容ajax,Ajax中send方法的使用
- 广工大第12届ACM校赛A
- 神经网络 异或_深度学习入门笔记(2)线性神经网络
- 天翼空间应用商城 App Market体验
- SaltStack之state.sls
- django 模型-----模型查询
- MVC三层架构详细图
- Panel 控件概述(Windows 窗体)
- python答辩毕设ppt_毕设答辩ppt总结
- Element表格固定第一列和第一行,并通过属性名动态渲染数据
- 【智能工厂】智能工厂4.0:数字世界和物理世界的融合
- openofficeV2.0由SUN开发的一款免费不亚于微软的office软件
- Zookeeper连接异常 Got ping response for sessionid 2021-06-30
- Java IO BIO NIO
- 视频播放不流畅怎么办?使用CDN加速一步搞定!
热门文章
- AJAX初探,XMLHttpRequest介绍
- 使用ArcGIS API for Silverlight实现地形坡度在线分析
- 模块化、层次化网络监控平台
- ADO.NET Data Services Framework 基础概述
- 解决 drupal8 提示“ settings.php ”设置未配置 问题
- 部署SCCM2012之先决条件准备
- Kotlin项目实践指南(上)
- 围观阿里云最会赚钱的人!价值2万元邀请码不限量发送
- org.springframework.data.mapping.PropertyReferenceException: No property xxxx found for type Xxxx
- 第一次使用MsChart运行提示:ChartImg.axd 执行子请求时出错。