Files
algorithms/btree.cpp
Aryadev Chavali 509c8930e8 (btree)+constructor for structure, cleaned up some code
Might as well use C++ features if I've got them
2023-07-09 16:22:23 +01:00

110 lines
1.9 KiB
C++

/* btree.cpp
* Date: 2021-11-22
* Author: Aryadev Chavali
*/
#include <iostream>
enum Order
{
LT,
GT,
EQ
};
template <typename T>
struct BinaryTree
{
T value;
BinaryTree<T> *left, *right;
enum Order (*compare)(T, T);
BinaryTree(T val, BinaryTree<T> *l, BinaryTree<T> *r, enum Order (*cmp)(T, T))
{
value = val;
left = l;
right = r;
compare = cmp;
}
~BinaryTree()
{
delete left;
delete right;
}
};
template <typename T>
BinaryTree<T> *insert(BinaryTree<T> *tree, T value)
{
BinaryTree<T> **node = &tree;
switch (tree->compare(value, tree->value))
{
case LT:
node = &tree->left;
break;
case EQ:
case GT:
node = &tree->right;
break;
}
*node = *node ? insert(*node, value)
: new BinaryTree<T>(value, nullptr, nullptr, tree->compare);
return tree;
}
template <typename T>
void rightRotate(BinaryTree<T> **tree)
{
auto left = *tree->left;
*tree->left = left->right;
left->right = *tree;
*tree = left;
}
template <typename T>
void leftRotate(BinaryTree<T> **tree)
{
auto right = (*tree)->right;
(*tree)->right = right->left;
right->left = *tree;
*tree = right;
}
template <typename T>
std::ostream &operator<<(std::ostream &ostream, const BinaryTree<T> *btree)
{
if (!btree)
return ostream;
ostream << btree->value << "(";
if (btree->left)
ostream << btree->left;
if (btree->left && btree->right)
ostream << ", ";
if (btree->right)
ostream << btree->right;
ostream << ")";
return ostream;
}
int main(void)
{
auto cmp = [](int x, int y)
{
if (x < y)
return LT;
else if (x > y)
return GT;
else
return EQ;
};
auto tree = new BinaryTree<int>(5, NULL, NULL, cmp);
for (int i = 0; i <= 5; ++i)
tree = insert(tree, i * 2);
leftRotate(&tree);
std::cout << tree << std::endl;
delete tree;
return 0;
}