Extracted comparator function into insert caller

This commit is contained in:
2024-06-23 21:55:16 +01:00
parent 894f79581f
commit 262ab3fefa

View File

@@ -17,13 +17,11 @@ struct BinaryTree
{ {
T value; T value;
BinaryTree<T> *left, *right; BinaryTree<T> *left, *right;
enum Order (*compare)(T, T); BinaryTree(T val, BinaryTree<T> *l, BinaryTree<T> *r)
BinaryTree(T val, BinaryTree<T> *l, BinaryTree<T> *r, enum Order (*cmp)(T, T))
{ {
value = val; value = val;
left = l; left = l;
right = r; right = r;
compare = cmp;
} }
~BinaryTree() ~BinaryTree()
@@ -34,10 +32,13 @@ struct BinaryTree
}; };
template <typename T> template <typename T>
BinaryTree<T> *insert(BinaryTree<T> *tree, T value) using comp_fn = enum Order (*)(T, T);
template <typename T>
BinaryTree<T> *insert(BinaryTree<T> *tree, T value, comp_fn<T> compare)
{ {
BinaryTree<T> **node = &tree; BinaryTree<T> **node = &tree;
switch (tree->compare(value, tree->value)) switch (compare(value, tree->value))
{ {
case LT: case LT:
node = &tree->left; node = &tree->left;
@@ -47,8 +48,8 @@ BinaryTree<T> *insert(BinaryTree<T> *tree, T value)
node = &tree->right; node = &tree->right;
break; break;
} }
*node = *node ? insert(*node, value) *node = *node ? insert(*node, value, compare)
: new BinaryTree<T>(value, nullptr, nullptr, tree->compare); : new BinaryTree<T>(value, nullptr, nullptr);
return tree; return tree;
} }
@@ -75,20 +76,18 @@ std::ostream &operator<<(std::ostream &ostream, const BinaryTree<T> *btree)
{ {
if (!btree) if (!btree)
return ostream; return ostream;
ostream << btree->value << "("; ostream << "(" << btree->value;
if (btree->left) if (btree->left)
ostream << btree->left; ostream << " " << btree->left;
if (btree->left && btree->right)
ostream << ", ";
if (btree->right) if (btree->right)
ostream << btree->right; ostream << " " << btree->right;
ostream << ")"; ostream << ")";
return ostream; return ostream;
} }
int main(void) int main(void)
{ {
auto cmp = [](int x, int y) comp_fn<int> cmp = [](int x, int y)
{ {
if (x < y) if (x < y)
return LT; return LT;
@@ -97,10 +96,11 @@ int main(void)
else else
return EQ; return EQ;
}; };
auto tree = new BinaryTree<int>(5, NULL, NULL, cmp); auto tree = new BinaryTree<int>(5, NULL, NULL);
for (int i = 0; i <= 5; ++i) for (int i = 0; i <= 5; ++i)
tree = insert(tree, i * 2); tree = insert(tree, i * 2, cmp);
std::cout << tree << std::endl;
leftRotate(&tree); leftRotate(&tree);
std::cout << tree << std::endl; std::cout << tree << std::endl;