ScapeGoatTree
Loading...
Searching...
No Matches
scapegoat_tree.hpp
Go to the documentation of this file.
1
23#ifndef SCAPEGOATTREE_SCAPEGOATTREE_HPP
24#define SCAPEGOATTREE_SCAPEGOATTREE_HPP
25
26#include <string>
27#include <cmath>
28#include "vector.hpp"
29#include "stack.hpp"
30#include "Node.hpp"
36enum class OpType {
37 Insert, // Insertion of a single value
38 Delete, // Deletion of a single value
39 BatchStart, // Marker for the beginning of a batch operation
40 BatchEnd // Marker for the end of a batch operation
41};
42
46template<typename T>
47struct Command {
48 OpType type; // Type of the operation
49 T value; // Value associated with the operation
50};
51
52template<typename T>
54
57 int nNodes{};
58 int rebuildCount = 0;
71 bool isUndoing = false;
72 int max_nodes = 0;
73 double ALPHA = 2.0/3.0;
74 // iterator class
75 class iterator {
76 TreeNode* curr; // stores current node
77
78 public:
79 // constructor
81
82 // dereference
83 T& operator*() { return curr->value; }
84
85 // pre-increment
88 return *this;
89 }
90
91 // post-increment
93 iterator temp = *this;
94 ++(*this);
95 return temp;
96 }
97
98 // comparison
99 bool operator!=(const iterator& other) const { return curr != other.curr; }
100 };
101
105 static int findH(const TreeNode* node);
109 static unsigned int countN(const TreeNode* node);
121 void inorderTraversal(const TreeNode*node, int &i,T*& array) const;
125 static void postorderTraversal(const TreeNode* node);
129 void preorderTraversal(const TreeNode* node);
133 void displayPreOrder(const TreeNode* node, std::ostream& os);
137 void displayInOrder(const TreeNode* node, std::ostream& os);
141 void displayPostOrder(const TreeNode* node, std::ostream& os);
145 [[nodiscard]] int getThreshold() const {return static_cast<int>(log(nNodes) / log(1/ALPHA));}
149 void DeletionRebuild();
153 bool areTreesEqual(const TreeNode* n1, const TreeNode* n2) const;
160 T kthSmallestHelper(TreeNode *node, int k) const;
162
163
164
165
166public:
167
172ScapeGoatTree(double alpha);
176 void insert(T value);
177
181 void insertBatch( const Vector<T> &values);
182
186 bool deleteValue(T value);
187
191 void deleteBatch(const Vector<T> &values);
192
196 [[nodiscard]] bool search(const T & key) const;
197 TreeNode* find_node(T& key) const;
198
202 void clear();
203 void undo();
204 void redo();
205 T sumInRange(T min, T max);
206 T getMin();
207 T getMax();
209 T getSuccessor(T value) const;
210 T kthSmallest(int k) const;
211 std::pair<ScapeGoatTree, ScapeGoatTree> split(T value);
212 int updateSize(TreeNode*& node);
213 void changeAlpha(const double alpha){if (alpha > 1 or alpha < 0.5)return; ALPHA=alpha;}
217 [[nodiscard]] std::string isBalanced() const;
218
219
223 const TreeNode* getRoot();
224 iterator begin();
225
226 static iterator end();
227
232
237
242
246 std::string displayPreOrder(); // for display
247
251 std::string displayInOrder() ; // for display
252
256 std::string displayPostOrder() ; // for display
257
261 std::string displayLevels(); // for display
262
266 bool operator[](T value) const;
267
272
277
282
286 ScapeGoatTree &operator=(int value);
287
291 bool operator==(const ScapeGoatTree &tree) const;
292
296 bool operator!=(const ScapeGoatTree &tree) const;
297
301 bool operator!() const;
302
306 void operator+(const T& value);
307
311 bool operator-(const T& value);
312
316 bool operator-=(const T& value);
317
321 void operator+=(const T& value);
322
323
324
325};
326#include "scapegoat_tree.tpp"
327
328#endif //SCAPEGOATTREE_SCAPEGOATTREE_HPP
Definition Node.hpp:8
T value
Definition Node.hpp:10
Definition queue.hpp:9
Definition scapegoat_tree.hpp:75
iterator(TreeNode *node)
Definition scapegoat_tree.hpp:80
TreeNode * curr
Definition scapegoat_tree.hpp:76
T & operator*()
Definition scapegoat_tree.hpp:83
iterator & operator++()
Definition scapegoat_tree.hpp:86
bool operator!=(const iterator &other) const
Definition scapegoat_tree.hpp:99
iterator operator++(int)
Definition scapegoat_tree.hpp:92
Definition scapegoat_tree.hpp:53
T sumHelper(TreeNode *node, T min, T max)
Definition scapegoat_tree.tpp:795
std::string displayInOrder()
Definition scapegoat_tree.tpp:446
std::string displayLevels()
Definition scapegoat_tree.tpp:468
bool isUndoing
Definition scapegoat_tree.hpp:71
bool operator-(const T &value)
Definition scapegoat_tree.tpp:653
T getMin()
Definition scapegoat_tree.tpp:811
int rebuildCount
Definition scapegoat_tree.hpp:58
bool operator==(const ScapeGoatTree &tree) const
Definition scapegoat_tree.tpp:612
static iterator end()
Definition scapegoat_tree.tpp:877
T kthSmallestHelper(TreeNode *node, int k) const
Definition scapegoat_tree.tpp:857
void inorderTraversal(const TreeNode *node, int &i, T *&array) const
Definition scapegoat_tree.tpp:360
void rangeHelper(TreeNode *node, T min, T max, Vector< T > &range)
Definition scapegoat_tree.tpp:827
TreeNode * findTraitor(TreeNode *node)
Definition scapegoat_tree.tpp:300
void changeAlpha(const double alpha)
Definition scapegoat_tree.hpp:213
ScapeGoatTree & operator=(const ScapeGoatTree &other)
Definition scapegoat_tree.tpp:547
ScapeGoatTree operator+(const ScapeGoatTree &other) const
Definition scapegoat_tree.tpp:504
T kthSmallest(int k) const
Definition scapegoat_tree.tpp:864
int updateSize(TreeNode *&node)
Definition scapegoat_tree.tpp:900
bool operator!() const
Definition scapegoat_tree.tpp:645
Stack< Command< T > > redoStack
Definition scapegoat_tree.hpp:66
int getThreshold() const
Definition scapegoat_tree.hpp:145
TreeNode * rebuildTree(int start, int end, TreeNode *parent_node, T *array)
Definition scapegoat_tree.tpp:318
bool operator[](T value) const
Definition scapegoat_tree.tpp:595
const TreeNode * getRoot()
Definition scapegoat_tree.tpp:348
T sumInRange(T min, T max)
Definition scapegoat_tree.tpp:806
iterator begin()
Definition scapegoat_tree.tpp:870
void undo()
Definition scapegoat_tree.tpp:736
Vector< T > valuesInRange(T min, T max)
Definition scapegoat_tree.tpp:834
void insertBatch(const Vector< T > &values)
Definition scapegoat_tree.tpp:142
Stack< Command< T > > undoStack
Definition scapegoat_tree.hpp:62
void operator+=(const T &value)
Definition scapegoat_tree.tpp:583
int max_nodes
Definition scapegoat_tree.hpp:72
~ScapeGoatTree()
Definition scapegoat_tree.tpp:38
static unsigned int countN(const TreeNode *node)
Definition scapegoat_tree.tpp:291
void clear()
Definition scapegoat_tree.tpp:724
std::pair< ScapeGoatTree, ScapeGoatTree > split(T value)
Definition scapegoat_tree.tpp:915
double ALPHA
Definition scapegoat_tree.hpp:73
int nNodes
Definition scapegoat_tree.hpp:57
static TreeNode * findSuccessor(TreeNode *node)
Definition scapegoat_tree.tpp:882
void restructure_subtree(TreeNode *newNode)
Definition scapegoat_tree.tpp:63
T getSuccessor(T value) const
Definition scapegoat_tree.tpp:841
std::string isBalanced() const
Definition scapegoat_tree.tpp:665
Node< T > TreeNode
Definition scapegoat_tree.hpp:55
void deleteBatch(const Vector< T > &values)
Definition scapegoat_tree.tpp:156
TreeNode * find_node(T &key) const
Definition scapegoat_tree.tpp:708
static void postorderTraversal(const TreeNode *node)
Definition scapegoat_tree.tpp:371
TreeNode * root
Definition scapegoat_tree.hpp:56
bool areTreesEqual(const TreeNode *n1, const TreeNode *n2) const
Definition scapegoat_tree.tpp:619
void DeletionRebuild()
Definition scapegoat_tree.tpp:331
void redo()
Definition scapegoat_tree.tpp:767
bool search(const T &key) const
Definition scapegoat_tree.tpp:695
void preorderTraversal(const TreeNode *node)
Definition scapegoat_tree.tpp:382
T getMax()
Definition scapegoat_tree.tpp:819
std::string displayPostOrder()
Definition scapegoat_tree.tpp:457
std::string displayPreOrder()
Definition scapegoat_tree.tpp:435
bool operator!=(const ScapeGoatTree &tree) const
Definition scapegoat_tree.tpp:637
bool deleteValue(T value)
Definition scapegoat_tree.tpp:174
bool operator-=(const T &value)
Definition scapegoat_tree.tpp:589
static int findH(const TreeNode *node)
Definition scapegoat_tree.tpp:281
void insert(T value)
Definition scapegoat_tree.tpp:87
OpType
Definition scapegoat_tree.hpp:36
@ BatchStart
Definition scapegoat_tree.hpp:47
OpType type
Definition scapegoat_tree.hpp:48
T value
Definition scapegoat_tree.hpp:49