Just checks the value of the current node against value, assesses if the leaf it needs to store it in is a NULL or not, then either allocates to that leaf or recursively calls insert on that leaf (so it may sort the value). Uses pointer magic for some cleaner code.
53 lines
767 B
C++
53 lines
767 B
C++
/* btree.cpp
|
|
* Date: 2021-11-22
|
|
* Author: Aryadev Chavali
|
|
*/
|
|
|
|
|
|
enum Order
|
|
{
|
|
LT,
|
|
GT,
|
|
EQ
|
|
};
|
|
|
|
template <typename T>
|
|
struct BinaryTree
|
|
{
|
|
T value;
|
|
BinaryTree<T> *left, *right;
|
|
enum Order (*compare)(T, T);
|
|
~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;
|
|
}
|
|
|
|
if (*node) {
|
|
*node = insert(*node, value);
|
|
return tree;
|
|
}
|
|
*node = new BinaryTree<T>;
|
|
(*node)->value = value;
|
|
(*node)->left = (*node)->right = nullptr;
|
|
(*node)->compare = tree->compare;
|
|
return tree;
|
|
}
|
|
|