[数据结构与算法] : AVL树

头文件

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

源文件

  1 #include "fatal.h"
  2 #include "avltree.h"
  3 #include <malloc.h>
  4
  5 struct AvlNode
  6 {
  7     ElementType Element;
  8     AvlTree Left;
  9     AvlTree Right;
 10     int     Height;
 11 };
 12
 13 AvlTree MakeEmpty(AvlTree T) // 同二叉查找树
 14 {
 15     if(T != NULL) // 递归终止
 16     {
 17         MakeEmpty(T->Left);
 18         MakeEmpty(T->Right);
 19         free(T);
 20     }
 21     return T;
 22 }
 23
 24 Position Find(ElementType X, AvlTree T) // 同二叉查找树
 25 {
 26     if(T == NULL)
 27         return NULL;
 28     else if(X < T->Element)
 29     {
 30         return Find(X, T->Left);
 31     }
 32     else if(X > T->Element)
 33     {
 34         return Find(X, T->Right);
 35     }
 36     else
 37         return T;
 38 }
 39
 40 Position FindMin(AvlTree T) // 递归实现
 41 {
 42     if(T == NULL)
 43         return NULL;
 44     else if(T->Left == NULL)
 45         return T;
 46     else
 47         return FindMin(T->Left);
 48 }
 49
 50 Position FindMax(AvlTree T) // 非递归实现
 51 {
 52     if(T != NULL)
 53         while(T->Right != NULL)
 54             T = T->Right;
 55
 56     return T;
 57 }
 58
 59 static int Height(Position P)
 60 {
 61     if(P == NULL)
 62         return -1; // 空树高度为-1
 63     else
 64         return P->Height;
 65 }
 66
 67 static int Max(int Left, int Right)
 68 {
 69     return Left > Right ? Left : Right;
 70 }
 71
 72 /* This function can be called only if K2 has a left child */
 73 /* Perform a rotate between a node (K2) and its left child */
 74 /* Update heights, then return new root */
 75 static Position SingleRotateWithLeft(Position K2)
 76 {
 77     Position K1;
 78
 79     K1 = K2->Left;
 80     K2->Left = K1->Right;
 81     K1->Right = K2;
 82
 83     K2->Height = Max(Height(K2->Left), Height(K2->Right)) + 1;
 84     K1->Height = Max(Height(K1->Left), Height(K1->Right)) + 1;
 85
 86     return K1;  /* New root */
 87 }
 88
 89 /* This function can be called only if K1 has a right child */
 90 /* Perform a rotate between a node (K1) and its right child */
 91 /* Update heights, then return new root */
 92 static Position SingleRotateWithRight(Position K1)
 93 {
 94     Position K2;
 95
 96     K2 = K1->Right;
 97     K1->Right = K2->Left;
 98     K2->Left = K1;
 99
100     K1->Height = Max(Height(K1->Left), Height(K1->Right)) + 1;
101     K2->Height = Max(Height(K2->Left), Height(K2->Right)) + 1;
102
103     return K2;  /* New root */
104 }
105
106 /* This function can be called only if K3 has a left */
107 /* child and K3‘s left child has a right child */
108 /* Do the left-right double rotation */
109 /* Update heights, then return new root */
110 static Position DoubleRotateWithLeft(Position K3)
111 {
112     /* Rotate between K1 and K2 */
113     K3->Left = SingleRotateWithRight(K3->Left);
114     /* Rotate between K3 and K2 */
115     return SingleRotateWithLeft(K3);
116 }
117
118 /* This function can be called only if K1 has a right */
119 /* child and K1‘s right child has a left child */
120 /* Do the right-left double rotation */
121 /* Update heights, then return new root */
122 static Position DoubleRotateWithRight(Position K1)
123 {
124     /* Rotate between K3 and K2 */
125     K1->Right = SingleRotateWithLeft(K1->Right);
126     /* Rotate between K1 and K2 */
127     return SingleRotateWithRight(K1);
128 }
129
130 // 1. 找位置; 2. 插入; 3. 平衡性; 4. 旋转
131 AvlTree Insert(ElementType X, AvlTree T)
132 {
133     if(T == NULL)
134     {
135         /* Create and return a one-node tree */
136         T = (AvlTree)malloc(sizeof(struct AvlNode));
137         if(T == NULL)
138             FatalError("Out of space!");
139         else
140         {
141             T->Left = T->Right = NULL;
142             T->Height = 0;
143             T->Element = X;
144         }
145     }
146     else if(X < T->Element)
147     {
148         T->Left = Insert(X, T->Left);
149         // 因为插到左边了, 所以肯定是左边比较高
150         if(Height(T->Left) - Height(T->Right) == 2)
151         {
152             if(X < T->Left->Element)
153                 T = SingleRotateWithLeft(T);
154             else
155                 T = DoubleRotateWithLeft(T);
156         }
157     }
158     else if(X > T->Element)
159     {
160         T->Right = Insert(X, T->Right);
161         // 插到右边了, 右边比较高
162         if(Height(T->Right) - Height(T->Left) == 2)
163         {
164             if(X > T->Right->Element)
165                 T = SingleRotateWithRight(T);
166             else
167                 T = DoubleRotateWithRight(T);
168         }
169     }
170     /* Else X is in the tree already; we‘ll do nothing */
171     T->Height = Max(Height(T->Left), Height(T->Right)) + 1;
172
173     return T;
174 }
175
176 AvlTree Delete(ElementType X, AvlTree T)
177 {
178     printf( "Sorry; Delete is unimplemented; %d remains\n", X );
179     return T;
180 }
181
182 ElementType Retrieve(Position P)
183 {
184     return P->Element;
185 }
186
187 void PrintTree(AvlTree T)
188 {
189     if( T != NULL)
190     {
191         PrintTree(T->Left);
192         printf("%d ", T->Element);
193         PrintTree(T->Right);
194     }
195 }

测试文件

 1 #include "avltree.h"
 2 #include <stdio.h>
 3
 4 main( )
 5 {
 6     AvlTree T;
 7     Position P;
 8     int i;
 9     int j = 0;
10
11     T = MakeEmpty( NULL );
12     for( i = 0; i < 50; i++, j = ( j + 7 ) % 50 )
13         T = Insert( j, T );
14     for( i = 0; i < 50; i++ )
15         if( ( P = Find( i, T ) ) == NULL || Retrieve( P ) != i )
16             printf( "Error at %d\n", i );
17
18  /* for( i = 0; i < 50; i += 2 )
19         T = Delete( i, T );
20
21     for( i = 1; i < 50; i += 2 )
22         if( ( P = Find( i, T ) ) == NULL || Retrieve( P ) != i )
23             printf( "Error at %d\n", i );
24     for( i = 0; i < 50; i += 2 )
25         if( ( P = Find( i, T ) ) != NULL )
26             printf( "Error at %d\n", i );
27 */
28     printf( "Min is %d, Max is %d\n", Retrieve( FindMin( T ) ),
29                Retrieve( FindMax( T ) ) );
30     PrintTree(T);
31     return 0;
32 }
时间: 2024-10-13 17:24:23

[数据结构与算法] : AVL树的相关文章

python数据结构与算法 36 树的基本概念

树 学习目标 理解什么是树及使用方法 学会使用树实现映射 用列表实现树 用类和引用实现树 用递归实现树 用堆实现优先队列 树的例子 前面我们学习过栈和队列这类线性数据结构,并且体验过递归,现在我们学习另一种通用数据结构,叫做树.树在计算机科学中应用广泛,象操作系统.图形学.数据库系统.网络等都要用到树.树和他们在自然界中的表哥--植物树--非常相似,树也有根,有分枝,有叶子.不同之处是,数据结构的树,根在顶上,而叶子在底部. 在开始学习之前,我们来研究几个普通的例子.第一个是生物学上的分级树.图

python数据结构与算法 37 树的实现

树的实现 记住上一节树的定义,在定义的基础上,我们用以下的函数创建并操作二叉树: BinaryTree() 创建一个二叉树实例 getLeftChild() 返回节点的左孩子 getRightChild() 返回节点的右孩子 setRootVal(val) 把val变量值赋给当前节点 getRootVal() 返回当前节点对象. insertLeft(val) 创建一个新二叉树作为当前节点的左孩子 insertRight(val) 创建一个新二叉树作为当前节点的右孩子. 实现树的关键点是合适的存

java数据结构与算法之树基本概念及二叉树(BinaryTree)的设计与实现

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53727333 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设

python数据结构与算法 39 树的遍历

树的遍历 在学习完成树的基本结构以后,我们开始研究一些树的应用模式.访问树的全部节点,一般有三种模式,这些模式的不同之处,仅在于访问节点的顺序不同.我们把这种对节点的访问称为"遍历",这三种遍历模式叫做前序.中序和后序.下面我们对遍历模式作更仔细的定义,同时研究使用这延续模式的例子. 前序遍历 在前序遍历中,先访问根节点,然后用递归方式前序遍历它的左子树,最后递归方式前序遍历右子树. 中序遍历 在中序遍历中,先递归中序遍历左子树,然后访问根节点,最后递归中序遍历右子树. 后序遍历 在后

数据结构与算法分析-AVL树深入探讨

.title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium; font-weight: bold; margin-top: 0 } .todo { font-family: monospace; color: red } .done { font-family: monospace; color: green } .priority { font-fami

数据结构(三)实现AVL树

AVL树的定义 一种自平衡二叉查找树,中面向内存的数据结构. 二叉搜索树T为AVL树的满足条件为: T是空树 T若不是空树,则TL.TR都是AVL树,且|HL-HR| <= 1 (节点的左子树高度与节点的右子树高度差的绝对值小于等于1) 说明 AVL树的实现类为AVLTree继承自前篇中的二叉搜索树BTreeSort ,AVL树的节点类为AVLNode继承自二叉树节点类BTreeNode. 实现代码 AVL树节点定义 1  public class AVLNode extends BTreeNo

数据结构-平衡二叉树(AVL树)

一.平衡二叉树的定义 使树的高度在每次插入元素后仍然能保持O(logn)的级别 AVL仍然是一棵二叉查找树 左右子树的高度之差是平衡因子,且值不超过1 //数据类型 struct node{ int v, height; node *lchild, *rchild; }; //新建一个结点 node* newNode(int v){ node* Node = new node; Node->v = v; Node->height = 1; Node->lchild = Node->

数据结构与算法之树

树 树的表示方式有 树形图表示法:逻辑结构描述直观 嵌套集合表示法(文氏图表示法) 凹入表示法 广义表表示法 二叉树 二叉树是另一种重要的树形结构,是度为2的有序树,它的特点是每个结点至多有两棵子树. 二叉树的递归定义 二叉树是n(n≥0)个结点的有限集.它或者是空集(n=0),或者同时满足以下两个条件: (1) 有且仅有一个根结点: (2) 其余的结点分成两棵互不相交的左子树和右子树. 二叉树的特点 如果二叉树的根结点只有一棵子树,必须明确区分它是左子树还是右子树,因为两者将构成不同形态的二叉

数据结构与算法——前缀树和贪心算法(1)

介绍前缀树 何为前缀树?如何生成前缀树? 例子:一个字符串类型的数组arrl,另一个字符串类型的数组arr2.arr2中有哪些字符,是arr 1中 出现的?请打印.arr2中有哪些字符,是作为arr 1中某个字符串前缀出现的?请打印.arr2 中有哪些字符,是作为arr1中某个字符串前缀出现的?请打印arr2中出现次数最大的前缀. public class TrieTree { public static class TrieNode { public int path; public int