dsalglib  1.0.0
dsalglib is a ready to use data structures and algorithms library written in C++ . Object Oriented Template implementations are written.
avltree.h
Go to the documentation of this file.
1 //
2 // Created by moghya_s on 10/1/2016.
3 //
4 
5 #ifndef DSALGLIB_AVLTREE_H
6 #define DSALGLIB_AVLTREE_H
7 
8 #include "queue.h"
9 
10 namespace dsa
11 {
12  template<class type>
13  class avltree
14  {
15  private:
16  static const long long int IF=1;
17  struct avltnode
18  {
19 
20  avltnode *left,*right;
21  type data;
22  long long int ht;
23 
24 
25  avltnode()
26  {
27  ht=-1;
28  left = nullptr;
29  right= nullptr;
30  }
31 
32  avltnode(type param)
33  {
34  ht=-1;
35  left = nullptr;
36  right= nullptr;
37  data = param;
38  }
39  };
40 
41  avltnode *root;
42  long long int count;
43 
44  avltnode * create_avltnode(type param)
45  {
46  avltnode *temp = new avltnode(param);
47  return temp;
48  }
49 
50  long long int _height(avltnode *troot)
51  {
52  if(troot==nullptr)
53  return -1;
54  else
55  return troot->ht;
56  }
57 
58  void _rotateR(avltnode * &troot)
59  {
60  avltnode *temp;
61  temp = troot->left;
62  troot->left = temp->right;
63  temp->right = troot;
64  troot->ht = maxof( _height( troot->left ), _height( troot->right ) ) + 1;
65  temp->ht = maxof( _height( temp->left ), troot->ht ) + 1;
66  troot = temp;
67  }
68 
69  void _rotateL(avltnode * &troot)
70  {
71  avltnode *temp;
72  temp = troot->right;
73  troot->right = temp->left;
74  temp->left = troot;
75  troot->ht = maxof( _height( troot->left ),_height( troot->right ) ) + 1;
76  temp->ht = maxof(troot->ht,_height( temp->right )) + 1;
77  troot = temp;
78  }
79 
80  void _drotateR(avltnode * &troot)
81  {
82  _rotateL(troot->left);
83  _rotateR(troot);
84  }
85 
86  void _drotateL(avltnode * &troot)
87  {
88  _rotateR(troot->right);
89  _rotateL(troot);
90  }
91 
92  void _balance(avltnode * &troot)
93  {
94  if(troot==nullptr) return;
95  long long int lh=_height(troot->left),rh=_height(troot->right);
96 
97  if(lh-rh>IF)
98  {
99  long long int llh=_height(troot->left->left), lrh=_height(troot->left->right);
100  if(llh>=lrh)
101  _rotateR(troot);
102  else
103  _drotateR(troot);
104  }
105  else if(rh-lh>IF)
106  {
107  long long int rlh=_height(troot->right->left), rrh=_height(troot->right->right);
108  if(rrh>=rlh)
109  _rotateL(troot);
110  else
111  _drotateL(troot);
112  }
113 
114  lh = _height( troot->left );
115  rh = _height( troot->right );
116  troot->ht= maxof( lh, rh ) + 1;
117 
118  }
119 
120  avltnode * _insert(avltnode *troot,avltnode *temp)
121  {
122 
123  if(troot==nullptr)
124  troot=temp;
125  else if(temp->data < troot->data)
126  troot->left = _insert(troot->left,temp);
127  else
128  troot->right = _insert(troot->right,temp);
129  _balance(troot);
130  return troot;
131  }
132 
133  avltnode * _find_min(avltnode * temp)
134  {
135  if(temp==nullptr) return nullptr;
136  if(temp->left==nullptr) return temp;
137  return _find_min(temp->left);
138  }
139 
140  avltnode * _find_max(avltnode * temp)
141  {
142  if(temp==nullptr) return nullptr;
143  if(temp->right==nullptr) return temp;
144  return _find_max(temp->right);
145  }
146 
147  avltnode * _remove(avltnode *troot,type param)
148  {
149 
150  if( troot == nullptr ) return troot;
151 
152  if( param < troot->data ) troot->left = _remove(troot->left,param);
153  else if( troot->data < param ) troot->right =_remove(troot->right,param);
154  else if(troot->left!=nullptr&&troot->right!=nullptr)
155  {
156  troot->data = _find_min(troot->right)->data;
157  troot->right = _remove(troot->right,troot->data);
158  }
159  else
160  {
161  avltnode *temp = troot;
162  troot = ( troot->left != nullptr ) ? troot->left : troot->right;
163  delete temp; count--;
164  }
165 
166  _balance(troot);
167  return troot;
168  }
169 
170  void _preorder(avltnode *temp,void (fun)(type obj))
171  {
172  if(temp==nullptr) return;
173 
174  fun(temp->data);
175  _preorder(temp->left,fun);
176  _preorder(temp->right,fun);
177 
178  }
179 
180  void _postorder(avltnode *temp,void (fun)(type obj))
181  {
182  if(temp==nullptr) return;
183 
184  _postorder(temp->left,fun);
185  _postorder(temp->right,fun);
186  fun(temp->data);
187  }
188 
189  void _inorder(avltnode *temp,void (fun)(type obj))
190  {
191  if(temp==nullptr) return;
192 
193  _inorder(temp->left,fun);
194  fun(temp->data);
195  _inorder(temp->right,fun);
196  }
197 
198  void _levelorder(void (fun) (type obj))
199  {
201 
202  avltnode *temp;
203  if(root!=nullptr)
204  {
205  q.enqueue(root);
206  while(!q.isempty())
207  {
208  temp=q.front_element();
209  fun(temp->data);
210  if(temp->left!=nullptr) q.enqueue(temp->left);
211  if(temp->right!=nullptr) q.enqueue(temp->right);
212  q.dequeue();
213  }
214  }
215  }
216 
217  avltnode * _search(avltnode *temp,type val)
218  {
219  if(temp==nullptr) return nullptr;
220 
221  if(val<temp->data) return _search(temp->left,val);
222  else if(temp->data<val) return _search(temp->right,val);
223  else return temp;
224 
225  }
226 
227  void _clear(avltnode *temp)
228  {
229  if(temp==nullptr) return;
230  _clear(temp->left);
231  _clear(temp->right);
232  delete temp;
233  }
234 
235  public:
236 
238  {
239  root=nullptr;
240  count=0;
241  }
242 
243  bool insert(type param)
244  {
245  avltnode *temp = create_avltnode(param);
246  root = _insert(root,temp);
247  count++;
248  return true;
249  }
250 
251  bool remove(type param)
252  {
253  long long int temp = count;
254  root = _remove(root,param);
255  if(count<temp)
256  return true;
257  else
258  return false;
259  }
260 
261  void preorder(void (fun)(type obj))
262  {
263  _preorder(root,fun);
264  }
265 
266  void postorder(void (fun)(type obj))
267  {
268  _postorder(root,fun);
269  }
270 
271  void inorder(void (fun)(type obj))
272  {
273  _inorder(root,fun);
274  }
275 
276  void levelorder(void (fun) (type obj))
277  {
278  _levelorder(fun);
279  }
280 
281  type find_min()
282  {
283  return _find_min(root)->data;
284  }
285 
286  type find_max()
287  {
288  return _find_max(root)->data;
289  }
290 
291  void clear()
292  {
293  _clear(root);
294  }
295 
296  long long int size()
297  {
298  return count;
299  }
300 
301  long long int height()
302  {
303  return _height(root);
304  }
305 
306  bool isempty()
307  {
308  if(count==0)
309  return true;
310  else
311  return false;
312  }
313 
314  type tree_root()
315  {
316  return root->data;
317  }
318 
319  bool search(type val)
320  {
321  if(_search(root,val)!=nullptr)
322  return true;
323  else
324  return false;
325  }
326 
327  };
328 }
329 #endif //DSALGLIB_AVLTREE_H
Definition: alginc.h:12
type tree_root()
Definition: avltree.h:314
long long int size()
Definition: avltree.h:296
void clear()
Definition: avltree.h:291
type dequeue()
Definition: queue.h:84
void postorder(void(fun)(type obj))
Definition: avltree.h:266
type find_min()
Definition: avltree.h:281
void levelorder(void(fun)(type obj))
Definition: avltree.h:276
bool search(type val)
Definition: avltree.h:319
bool insert(type param)
Definition: avltree.h:243
type enqueue(type param)
Definition: queue.h:60
void preorder(void(fun)(type obj))
Definition: avltree.h:261
void inorder(void(fun)(type obj))
Definition: avltree.h:271
bool isempty()
Definition: avltree.h:306
bool isempty()
Definition: queue.h:183
T maxof(T x, T y)
Definition: alginc.h:25
type find_max()
Definition: avltree.h:286
long long int height()
Definition: avltree.h:301
type front_element()
Definition: queue.h:119