平衡树AVL

  1 #include<iostream>
  2 using namespace std;
  3
  4 class AVL
  5 {
  6 public:
  7     enum BF { RH = 1 , EH , LH };
  8     class Node
  9     {
 10     public:
 11         Node* lchild;
 12         Node* rchild;
 13         int   data;
 14         BF   bf;
 15         Node(): lchild(NULL) , rchild(NULL) , data(0) , bf(EH) {}
 16     };
 17     typedef Node* PNode;
 18     PNode root;
 19 public:
 20     AVL():root(NULL) {}
 21     ~AVL(){ DestoryTree(); }
 22     int Insert(int value );
 23     int InsertAVL( PNode& T , int value , int &taller );
 24     void R_Rotate( PNode &T );
 25     void L_Rotate( PNode &T );
 26     void LeftBalance( PNode &T);
 27     void RightBalance( PNode &T);
 28     void print();
 29     void DFS(PNode &T);
 30     void DestoryTree();
 31     void Destory( PNode &T );
 32 };
 33
 34 int AVL::Insert( int value)
 35 {
 36     int taller;
 37     int res =  InsertAVL( root , value , taller );
 38     cout << "============Insert " << value << "============" << endl;
 39     print();
 40     cout << endl;
 41     return res;
 42 }
 43
 44 void AVL::R_Rotate( PNode &T )
 45 {
 46     PNode lc = T->lchild;
 47     T->lchild = lc->rchild ;
 48     lc->rchild = T;
 49     T = lc;
 50 }
 51
 52 void AVL::L_Rotate( PNode& T )
 53 {
 54     PNode rc = T->rchild ;
 55     T->rchild = rc->lchild;
 56     rc->lchild = T ;
 57     T = rc;
 58 }
 59
 60 void AVL::LeftBalance( PNode& T )
 61 {
 62     PNode &temp = T->lchild ;
 63     switch( temp->bf )
 64     {
 65     case LH:
 66         T->bf = EH;
 67         temp->bf = EH;
 68         R_Rotate( T );
 69         break;
 70     case RH:
 71         PNode temp2 = temp->rchild;
 72         switch( temp2->bf  )
 73         {
 74         case LH:
 75             temp2->bf = EH;
 76             T->bf = RH;
 77             temp->bf = EH;
 78             break;
 79         case EH:
 80             temp2->bf = T->bf = temp->bf = EH;
 81             break;
 82         case RH:
 83             T->bf = EH;
 84             temp->bf = LH;
 85             temp2->bf = EH;
 86             break;
 87         }
 88         L_Rotate( temp );
 89         R_Rotate( T );
 90         break;
 91     }
 92 }
 93
 94 void AVL::RightBalance( PNode& T )
 95 {
 96     PNode &temp = T->rchild ;
 97     switch( temp->bf )
 98     {
 99     case RH:
100         T->bf = temp->bf = EH;
101         L_Rotate( T );
102         break;
103     case LH:
104         PNode temp2 = temp->lchild;
105         switch( temp2->bf )
106         {
107         case LH:
108             T->bf = EH;
109             temp2->bf = EH;
110             temp->bf = RH;
111             break;
112         case RH:
113             T->bf = LH;
114             temp2->bf = EH;
115             temp->bf = EH;
116             break;
117         case EH:
118             T->bf = temp2->bf = temp->bf = EH;
119             break;
120         }
121         R_Rotate( temp );
122         L_Rotate( T );
123         break;
124     }
125 }
126
127 int AVL::InsertAVL( PNode& T , int value , int& taller )
128 {
129     if( !T )
130     {
131         PNode temp = new Node;
132         temp->data = value;
133         temp->bf = EH;
134         T = temp;
135         taller = true;
136     }
137     else
138     {
139         if( T->data == value )
140         {
141             taller = false;
142             return false;
143         }
144         else if( T->data > value )
145         {
146             if( InsertAVL( T->lchild , value , taller ) )
147             {
148                 if( taller )
149                 {
150                     switch( T->bf )
151                     {
152                     case LH:
153                         LeftBalance( T );
154                         taller = false;
155                         break;
156                     case EH:
157                         T->bf = LH;
158                         taller = true;
159                         break;
160                     case RH:
161                         T->bf = EH;
162                         taller = false;
163                         break;
164                     }
165                 }
166             }
167             else
168                 return false;
169         }
170         else
171         {
172             if( InsertAVL( T->rchild , value , taller ) )
173             {
174                 if ( taller )
175                 {
176                     switch( T->bf )
177                     {
178                     case LH:
179                         T->bf = EH;
180                         taller = false;
181                         break;
182                     case EH:
183                         T->bf = RH;
184                         taller = true;
185                         break;
186                     case RH:
187                         RightBalance(T);
188                         taller = false;
189                         break;
190                     }
191                 }
192             }
193             else
194                 return false;
195         }
196     }
197     return true;
198 }
199
200 void AVL::DFS(PNode &T)
201 {
202     if( T )
203     {
204         if( T->lchild )
205             DFS( T->lchild );
206         cout << "visit " << T->data  << "    The bf is " << T->bf - 2  << endl;
207         if( T->rchild )
208             DFS( T->rchild );
209     }
210 }
211
212 void AVL::print()
213 {
214     DFS( root );
215 }
216
217 void AVL::DestoryTree()
218 {
219     Destory( root );
220 }
221
222 void AVL::Destory( PNode& T )
223 {
224     if( T )
225     {
226         PNode q = T ;
227         if( T->lchild )
228             Destory( T->lchild );
229         if( T->rchild )
230             Destory( T->rchild );
231         free( q );
232         T = NULL;
233     }
234 }
235
236 int main()
237 {
238     AVL avl;
239     avl.Insert( 10 );
240     avl.Insert( 12 );
241     avl.Insert( 2 );
242     avl.Insert( -1 );
243     avl.Insert( -2 );
244     avl.Insert( 3 );
245     return 0;
246 }
时间: 2024-10-09 08:47:40

平衡树AVL的相关文章

树-二叉平衡树AVL

基本概念 AVL树:树中任何节点的两个子树的高度最大差别为1. AVL树的查找.插入和删除在平均和最坏情况下都是O(logn). AVL实现 AVL树的节点包括的几个组成对象: (01) key -- 是关键字,是用来对AVL树的节点进行排序的. (02) left -- 是左孩子. (03) right -- 是右孩子. (04) height -- 是高度.即空的二叉树的高度是0,非空树的高度等于它的最大层次(根的层次为1,根的子节点为第2层,依次类推). AVL旋转算法 AVL失衡四种形态

二叉树--二叉平衡树

二叉平衡树是二叉树中最为最要的概念之一,也是在语言库或者项目中应用比较广泛的一种特殊的树形结构. 二叉平衡树 AVL树是高度平衡的而二叉树.它的特点是:AVL树中任何节点的两个子树的高度最大差别为1. 通常AVL树是在二叉搜索树上,经过局部调整而建立的,因此,它还是一棵排序树. 上面的两张图片,左边的是AVL树,它的任何节点的两个子树的高度差别都<=1:而右边的不是AVL树,因为7的两颗子树的高度相差为2(以2为根节点的树的高度是3,而以8为根节点的树的高度是1). 性质 左右子树相差不超过1.

第三部分数据结构[专业课考试3]

考试题型:问答.分析.编程(廖老师:可用自己熟悉的程序语言.伪代码均可) 总分:60分 一.栈(Stack).队列(Queue)和向量(Vector) 内容: 单链表,双向链表,环形链表,带哨兵节点的链表; 栈的基本概念和性质,栈ADT及其顺序,链接实现;栈的应用;栈与递归; 队列的基本概念和性质,队列ADT及其顺序,链接实现;队列的应用; 向量基本概念和性质;向量ADT及其数组.链接实现; 二.树 内容: 树的基本概念和术语;树的前序,中序,后序,层次序遍历; 二叉树及其性质;普通树与二叉树的

平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】

平衡树初阶——AVL平衡二叉查找树 一.什么是二叉树 1. 什么是树. 计算机科学里面的树本质是一个树状图.树首先是一个有向无环图,由根节点指向子结点.但是不严格的说,我们也研究无向树.所谓无向树就是将有向树的所有边看成无向边形成的树状图.树是一种递归的数据结构,所以我们研究树也是按照递归的方式去研究的. 2.什么是二叉树. 我们给出二叉树的递归定义如下: (1)空树是一个二叉树. (2)单个节点是一个二叉树. (3)如果一棵树中,以它的左右子节点为根形成的子树都是二叉树,那么这棵树本身也是二叉

AVL平衡树的插入例程

/* **AVL平衡树插入例程 **2014-5-30 11:44:50 */ avlTree insert(elementType X, avlTree T){ if(T == NULL){ T = malloc(sizeof(struct avlTree)); if(T == NULL) fatalError("Out of space!!!"); T->element = X; T->height = 0; T->left = T->right = NUL

各种平衡树Treap/SBT/Avl/Splay tree

看了这么久的平衡树,是时候做个总结了. 以poj 3481为例,敲了四份代码,分别是Treap ,Size Balance Tree,Avl Tree,splay tree. 唯独少了红黑树T_T... 总的来说每种平衡树各有各的优点吧: Treap写起来简单上手也快如果熟练的话不到十分种可以敲完. SBT速度快名不虚传... Avl树高度平衡吧,不过实际的效果不尽如人意,可能是我实现的姿势不对吧/(ㄒoㄒ)/~~ splay tree各方面比较均衡,特别的伸展树在维护序列方面相对其它几种树优势

AVL 平衡树

AVL是一种平衡二叉树,它通过对二叉搜索树中的节点进行旋转使得二叉搜索树达到平衡.AVL在所有的平衡二叉搜索树中具有最高的平衡性. 定义 平衡二叉树或者为空树或者为满足如下性质的二叉搜索树: 左右子树的高度之差绝对值不超过1 左右子树仍然为平衡二叉树 定义平衡因子 BF(x) = x的左子树高度 - x的右子树的高度.平衡二叉树的每个节点的平衡因子只能为-1, 0, 1. 维持平衡思想 若二叉树当前为平衡状态,此时插入/删除一个新的节点,此时有可能造成二叉树不满足平衡条件,此时需要通过对节点进行

AVL树(自平衡树)——c++实现

AVL树是高度平衡的而二叉树.它的特点是:AVL树中任何节点的两个子树的高度最大差别为1. AVL树本质上还是一棵二叉搜索树,它的特点是: 1.本身首先是一棵二叉搜索树. 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1. 也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树). 既然是树,那么就要有节点: template <class T> struct AVLTreeNode{ T data; int height; AVLTreeNod

java项目---用java实现二叉平衡树(AVL树)并打印结果(详)

1 package Demo; 2 3 public class AVLtree { 4 private Node root; //首先定义根节点 5 6 private static class Node{ //定义Node指针参数 7 private int key; //节点 8 private int balance; //平衡值 9 private int height; //树的高度 10 private Node left; //左节点 11 private Node right;