5 #ifndef DSALGLIB_AVLTREE_H 6 #define DSALGLIB_AVLTREE_H 16 static const long long int IF=1;
20 avltnode *left,*right;
44 avltnode * create_avltnode(type param)
46 avltnode *temp =
new avltnode(param);
50 long long int _height(avltnode *troot)
58 void _rotateR(avltnode * &troot)
62 troot->left = temp->right;
64 troot->ht =
maxof( _height( troot->left ), _height( troot->right ) ) + 1;
65 temp->ht =
maxof( _height( temp->left ), troot->ht ) + 1;
69 void _rotateL(avltnode * &troot)
73 troot->right = temp->left;
75 troot->ht =
maxof( _height( troot->left ),_height( troot->right ) ) + 1;
76 temp->ht =
maxof(troot->ht,_height( temp->right )) + 1;
80 void _drotateR(avltnode * &troot)
82 _rotateL(troot->left);
86 void _drotateL(avltnode * &troot)
88 _rotateR(troot->right);
92 void _balance(avltnode * &troot)
94 if(troot==
nullptr)
return;
95 long long int lh=_height(troot->left),rh=_height(troot->right);
99 long long int llh=_height(troot->left->left), lrh=_height(troot->left->right);
107 long long int rlh=_height(troot->right->left), rrh=_height(troot->right->right);
114 lh = _height( troot->left );
115 rh = _height( troot->right );
116 troot->ht=
maxof( lh, rh ) + 1;
120 avltnode * _insert(avltnode *troot,avltnode *temp)
125 else if(temp->data < troot->data)
126 troot->left = _insert(troot->left,temp);
128 troot->right = _insert(troot->right,temp);
133 avltnode * _find_min(avltnode * temp)
135 if(temp==
nullptr)
return nullptr;
136 if(temp->left==
nullptr)
return temp;
137 return _find_min(temp->left);
140 avltnode * _find_max(avltnode * temp)
142 if(temp==
nullptr)
return nullptr;
143 if(temp->right==
nullptr)
return temp;
144 return _find_max(temp->right);
147 avltnode * _remove(avltnode *troot,type param)
150 if( troot ==
nullptr )
return troot;
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)
156 troot->data = _find_min(troot->right)->data;
157 troot->right = _remove(troot->right,troot->data);
161 avltnode *temp = troot;
162 troot = ( troot->left != nullptr ) ? troot->left : troot->right;
163 delete temp; count--;
170 void _preorder(avltnode *temp,
void (fun)(type obj))
172 if(temp==
nullptr)
return;
175 _preorder(temp->left,fun);
176 _preorder(temp->right,fun);
180 void _postorder(avltnode *temp,
void (fun)(type obj))
182 if(temp==
nullptr)
return;
184 _postorder(temp->left,fun);
185 _postorder(temp->right,fun);
189 void _inorder(avltnode *temp,
void (fun)(type obj))
191 if(temp==
nullptr)
return;
193 _inorder(temp->left,fun);
195 _inorder(temp->right,fun);
198 void _levelorder(
void (fun) (type obj))
210 if(temp->left!=
nullptr) q.
enqueue(temp->left);
211 if(temp->right!=
nullptr) q.
enqueue(temp->right);
217 avltnode * _search(avltnode *temp,type val)
219 if(temp==
nullptr)
return nullptr;
221 if(val<temp->data)
return _search(temp->left,val);
222 else if(temp->data<val)
return _search(temp->right,val);
227 void _clear(avltnode *temp)
229 if(temp==
nullptr)
return;
245 avltnode *temp = create_avltnode(param);
246 root = _insert(root,temp);
251 bool remove(type param)
253 long long int temp = count;
254 root = _remove(root,param);
268 _postorder(root,fun);
283 return _find_min(root)->data;
288 return _find_max(root)->data;
303 return _height(root);
321 if(_search(root,val)!=
nullptr)
329 #endif //DSALGLIB_AVLTREE_H
void postorder(void(fun)(type obj))
void levelorder(void(fun)(type obj))
void preorder(void(fun)(type obj))
void inorder(void(fun)(type obj))