5#ifndef TREE_SCAPEGOATTREE_TPP
6#define TREE_SCAPEGOATTREE_TPP
31 if (!
Otree.root)
return;
32 preorderTraversal(
Otree.root);
39 postorderTraversal(root);
49max_nodes(
other.max_nodes) {
66 if (
goat ==
nullptr)
return;
79 postorderTraversal(
goat);
96 if (nNodes > max_nodes) max_nodes = nNodes;
115 for (
int i = 0;
i <
path.size();
i++) {
133 if (nNodes > max_nodes) max_nodes = nNodes;
135 if (
depth + 1 <= getThreshold())
return;
146 for (
int i = 0;
i <
values.size();
i++) {
159 for (
int i = 0;
i <
values.size();
i++) {
188 if (!
node)
return false;
209 parent->
left =
nullptr;
212 parent->
right =
nullptr;
228 if (
node->left !=
nullptr)
233 child->parent = parent;
248 else if (
node->left &&
node->right) {
251 while (
suc->left !=
nullptr)
282 if (!
node)
return -1;
283 const int max = findH(
node->left) > findH(
node->right) ? findH(
node->left) :findH(
node->right);
301 while (
node !=
nullptr) {
302 const int left = countN(
node->left);
303 const int right = countN(
node->right);
304 int size =
node->size;
306 if (left > ALPHA * size || right > ALPHA * size)
319 if (
start > end)
return nullptr;
337 root = rebuildTree(0, nNodes - 1,
nullptr,
temp_array);
373 postorderTraversal(
node->left);
374 postorderTraversal(
node->right);
385 preorderTraversal(
node->left);
386 preorderTraversal(
node->right);
401 displayPreOrder(
node->left,
os);
402 displayPreOrder(
node->right,
os);
411 displayInOrder(
node->left,
os);
413 displayInOrder(
node->right,
os);
422 displayPostOrder(
node->left,
os);
423 displayPostOrder(
node->right,
os);
436 if (!root)
return "Tree is empty.";
437 std::ostringstream
oss;
438 displayPreOrder(root,
oss);
447 if (!root)
return "Tree is empty.";
448 std::ostringstream
oss;
449 displayInOrder(root,
oss);
458 if (!root)
return "Tree is empty.";
459 std::ostringstream
oss;
460 displayPostOrder(root,
oss);
469 if (!root)
return "Tree is Empty.";
475 while (!
q.isEmpty()) {
476 result +=
"Level " + std::to_string(
level++) +
": ";
482 std::ostringstream
oss;
509 inorderTraversal(root,
i,
array);
548 if (
this == &
other)
return *
this;
549 postorderTraversal(root);
551 if (
other.root) preorderTraversal(
other.root);
560 if (
this == &
other)
return *
this;
561 postorderTraversal(root);
563 nNodes =
other.nNodes;
564 max_nodes =
other.max_nodes;
566 other.root =
nullptr;
596 return search(
value);
613 return areTreesEqual(root,
tree.root);
621 if (!
n1 && !
n2)
return true;
624 if (!
n1 || !
n2)
return false;
630 return areTreesEqual(
n1->left,
n2->left) &&
631 areTreesEqual(
n1->right,
n2->right);
638 return !(*
this ==
tree);
646 return root ==
nullptr;
654 return deleteValue(
value);
666 std::ostringstream
out;
668 const double n = countN(root);
670 out <<
"Tree empty. Of course it's balanced ";
678 out <<
"Node count: " <<
n <<
"\n";
680 out <<
"Height bound: " <<
bound <<
"\n";
681 out <<
"Total Rebuilds: " << rebuildCount <<
"\n\n";
684 out <<
"^_____^ Tree is balanced. \nCongratulations, It's not a Linked List.\n";
686 out <<
"~_~ Tree is NOT balanced. A scapegoat must be sacrificed.\n";
725 postorderTraversal(root);
737 if (undoStack.isEmpty())
return;
745 while (!undoStack.isEmpty()) {
768 if (redoStack.isEmpty())
return;
776 while (!redoStack.isEmpty()) {
807 return sumHelper(root,
min,
max);
812 if (!root)
throw std::runtime_error(
"Tree is Empty");
820 if (!root)
throw std::exception(
"Tree is Empty");
837 return std::move(
range);
852 if (!
successor)
throw std::runtime_error(
"No successor found");
865 if (
k < 1 || k > nNodes)
throw std::out_of_range(
"k is out of bounds");
866 return kthSmallestHelper(root,
k);
871 if (!root)
return end();
873 while (curr->
left)curr = curr->
left;
883 if (!
node)
return nullptr;
887 while (
suc->left !=
nullptr)
892 while (
p &&
node ==
p->right) {
906 const int left = updateSize(
node->left);
907 const int right = updateSize(
node->right);
910 node->size = left+right+1;
921 if (parent->left ==
node) parent->left =
nullptr;
922 if (parent->right ==
node) parent->right =
nullptr;
926 updateSize(
tree1.root);
927 updateSize(
tree2.root);
T value
Definition Node.hpp:10
Node * right
Definition Node.hpp:12
Node * left
Definition Node.hpp:11
T value
Definition queue.hpp:11
Definition scapegoat_tree.hpp:75
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 operator-(const T &value)
Definition scapegoat_tree.tpp:653
T getMin()
Definition scapegoat_tree.tpp:811
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
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
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
void operator+=(const T &value)
Definition scapegoat_tree.tpp:583
~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
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
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
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