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