diff options
Diffstat (limited to 'impls/btree.cpp')
| -rw-r--r-- | impls/btree.cpp | 109 | 
1 files changed, 109 insertions, 0 deletions
diff --git a/impls/btree.cpp b/impls/btree.cpp new file mode 100644 index 0000000..4067aad --- /dev/null +++ b/impls/btree.cpp @@ -0,0 +1,109 @@ +/* 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; +}  | 
