AVL树详解

原创 2016年05月31日 10:50:34

AVL树C++代码实现

1、源文件tree.h

1 
  2 #include <iostream>
  3 using namespace std;
  4 
  5 template<class T>
  6 struct TreeNode
  7 {
  8     T data;
  9     T df;
 10     struct TreeNode<T> *leftchild,*rightchild;
 11     TreeNode(const T &d=T(),const T &df=T())
 12         :data(d),df(0),leftchild(NULL),rightchild(NULL)
 13     {}
 14 };
 15 
 16 template<class T>
 17 class Tree
 18 {
 19     public:
 20         //插入算法
 21         void insert(const T &key)
 22         {
 23             insert(root,key);
 24         }
 25     private:
 26         void insert(TreeNode<T> *&pcur,const T &key)
 27         {
 28             TreeNode<T> *cur=pcur;
 29             TreeNode<T> *tmp=NULL;
 30             T d;
 31             stack<TreeNode<T> *> s;
 32             while(cur !=NULL)
 33             {
 34                 if(cur->data==key)
 35                     return;
 36                 tmp=cur;
 37                 s.push(tmp);//用栈保存查找记录
 38                 if(cur->data >key)
 39                     cur=cur->leftchild;
 40                 else
 41                     cur=cur->rightchild;
 42             }
 43             cur=new TreeNode<T>(key);
 44             if(pcur==NULL) //当一个节点都没有的时候
 45             {
 46                 pcur=cur;
 47                 return;
 48             }
 49             if(key < tmp->dat)
 50                 tmp->leftchild=cur;
 51             else
 52                 tmp->rightchild=cur;
 53             ///////////////插入成功////////////////
 54             while(!s.empty())
 55             {
 56                 s.pop();
 57                 //平衡因子=右孩子-左孩子
 58                 //如果在tmp的左孩子中插入节点,平衡因子--,
 59                 //如果在tmp的右孩子中插入节点,平衡因子++
 60                 
 61                 if(cur==tmp->leftchild)
 62                     tmp->df--;
 63                 else
 64                     tmp->df++;
 65                 ////////////////////
 66                 if(tmp->df==0)
 67                     break;
 68                 if(tmp->df==1 || tmp->df==-1)
 69                     cur=tmp;
 70                 else
 71                 {
 72                     d=(tmp->df <0)?-1:1;
 73                     if(cur->df==d)
 74                     {
 75                         if(d==-1)
 76                             RotateR(tmp);
 77                         else
 78                             RotateL(tmp);
 79                     }else
 80                     {
 81                         if(d==-1)
 82                             RotateLR(tmp);
 83                         else
 84                             RotateLR(tmp);
 85                     }
 86                     break;
 87                 }
 88             }
 89             /////////////////
 90             if(s.empty())
 91                 pcur=tmp;
 92             else
 93             {
 94                 TreeNode<T> *pre=NULL;
 95                 s.get_top(pre);
 96                 if(pre->data > tmp->data)
 97                     pre->leftchild=tmp;
 98                 else
 99                     pre->rightchild=tmp;
100             }
101         }
102     private:
103         //左单旋转法
104         //因为两个节点的平衡因子值的(正负)号相同,均为正,因此用左单旋
105         void RotateL(TreeNode<T> *&cur)
106         {
107             TreeNode<T> *tmp=cur;
108             cur=cur->rightchild;
109             tmp->rightchild=cur->leftchild;
110             cur->leftchild=tmp;
111             cur->df=tmp->df=0;
112         }
113         //右单旋转法,
114         //因为两节点的平衡因子的值(正负)号相同,均为负(-),所以用右单旋
115         void RotateR(TreeNode<T> *&cur)
116         {
117             TreeNode<T> *tmp=cur;
118             cur=cur->leftchild;
119             tmp->leftchild=cur->rightchild;
120             cur->rightchild=tmp;
121             cur->df=tmp->df=0;
122         }
123         //先左后右双旋转
124         void RotateLR(TreeNode<T> *&cur)
125         {
126             TreeNode<T> *Rtmp=cur;
127             TreeNode<T> *Ltmp=cur->leftchild;
128             cur=Ltmp->rightchild;
129             //先进行左单旋
130             Ltmp->rightchild=cur->leftchild;
131             cur->leftchild=Ltmp;
132             if(cur->df <=0)
133                 Ltmp->df=0;
134             else
135                 Ltmp->df=-1;
136             //再进行右单旋
137             Rtmp->leftchild=cur->rightchild;
138             cur->rightchild=Rtmp;
139             if(cur->df==-1)
140                 Rtmp->df=1;
141             else
142                 Rtmp->df=0;
143             cur->df=0;
144         }
145         //先右后左双旋转
146         void RotateRL(TreeNode<T> *&cur)
147         {
148             TreeNode<T> *Ltmp=cur;
149             TreeNode<T> *Rtmp=cur->rightchild;
150             cur=Rtmp->leftchild;
151             //先进行右单旋
152             Rtmp->leftchild=cur->rightchild;
153             cur->rightchild=Rtmp;
154             if(cur->df >=0)
155                 Rtmp->df=0;
156             else
157                 Rtmp->df=1;
158             //再进行左单旋
159             Ltmp->rightchild=cur->leftchild;
160             cur->leftchild=Ltmp;
161             if(cur->df ==1)
162                 Ltmp->df=-1;
163             else
164                 Ltmp->df=0;
165             cur->df=0;
166         }
167     public:
168         //先右后左双旋转
169         void RotateRL()
170         {
171             RotateRL(root);
172         }
173         //先左后右双旋转
174         void RotateLR()
175         {
176             RotateLR(root);
177         }
178         //左单旋转法
179         void RotateL()
180         {
181             RotateL(root);
182         }
183         //右单旋转法
184         void RotateR()
185         {
186             RotateR(root);
187         }
188     public:
189         Tree(const T v=T()):value(v),root(NULL)
190         {}
191     private:
192         T value;
193         TreeNode<T> *root;
194 };  




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

平衡树详解之AVL

前言:          本文介绍了AVL的插入和删除, 首先让我们想一下很简单的二分查找,其效率为O(lgn),这是很好的,而大多数时候在数据的处理涉及到插入和删除,但是,线型表仅仅使用于查找,所以...

【数据结构】AVL树详解

1.什么是AVL树 AVL树又称平衡二叉搜索树,它能保证二叉树高度相对平衡,尽量降低二叉树的高度,提高搜索效率。单纯的二叉搜索树在最坏的情况下插入查找删除等操作时间复杂度会是O(N), 例如: 所...

平衡树(AVL)详解

1. 为什么平衡树? 在二叉搜索树(BST,Binary Search Tree)中提到,BST树可能会退化成一个链表(整棵树中只有左子树,或者只有右子树),这将大大影响二叉树的性能。 前苏联科学...

【c++】AVL树详解

AVL树是又叫平衡二叉搜索树,但是它不是完全平衡,只是近似平衡(高度平衡)。什么叫完全平衡?想象一下完全二叉树。 根据名字’二叉搜索树‘,我们可以知道它的一些性质: 1. 每个节点都有一个作为搜索依据...
  • LLZK_
  • LLZK_
  • 2016-10-30 10:50
  • 778

AVL树详解&面试题-判断一棵树是否是平衡二叉树

上次写了关于二叉搜索树的分析,但是二叉搜索树有一个缺陷,就是当插入一个有序(或接近有序)的序列时,二叉搜索树就相当于一个链表了,搜索效率会特别低。那么,如何来改进呢?这就引入了AVL树(高度平衡二叉树...

二叉树之一BST树,AVL树详解及B树和红黑树原理分析

BST树,AVL树详解及B树和红黑树原理分析 互联网面试中树尤其是BST,AVL是提问的重点也是难点,甚至B树乃至高级数据结构红黑树都是提问的重点,像阿里云面试就曾经问过map实现机制(红黑树)及其原...

AVL树插入删除算法详解(有图) -- C++语言实现

一:AVL树介绍 AVL树本质上还是一棵二叉搜索树,它的特点是: 1.本身首先是一棵二叉搜索树。 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。在本文中用分别用-1,0...

AVL树详解与总结

AVL树的插入和删除

数据结构:关于AVL树的平衡旋转详解

AVL树又叫做平衡二叉树。前言部分我也有说到,AVL树的前提是二叉排序树(BST或叫做二叉搜索树)。由于在生成BST树的过程中可能会出现线型树结构,比如插入的顺序是:1, 2, 3, 4, 5, 6,...

平衡二叉树(AVL)的插入和删除详解(上)

AVL树维基百科:http://zh.wikipedia.org/wiki/AVL树 在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)