Extracted comparator function into insert caller
This commit is contained in:
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user