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