Browse Source

avl_tree: bug fix on chain insertion/deletion.

undefined
Guillaume Bittoun Sam Hocevar <sam@hocevar.net> 11 years ago
parent
commit
b2a2f5bf9d
2 changed files with 30 additions and 6 deletions
  1. +14
    -6
      src/lol/algorithm/avl_tree.h
  2. +16
    -0
      src/t/algorithm/avl_tree.cpp

+ 14
- 6
src/lol/algorithm/avl_tree.h View File

@@ -410,20 +410,28 @@ protected:
this->m_parent_slot = nullptr; this->m_parent_slot = nullptr;
this->m_child[0] = nullptr; this->m_child[0] = nullptr;
this->m_child[1] = nullptr; this->m_child[1] = nullptr;
this->m_chain[0] = nullptr;
this->m_chain[1] = nullptr;
} }


void replace_chain(tree_node * replacement) void replace_chain(tree_node * replacement)
{ {
for (int i = 0 ; i < 2 ; ++i) for (int i = 0 ; i < 2 ; ++i)
{ {
if (this->m_chain[i])
if (replacement)
{ {
this->m_chain[i]->m_chain[i ? 0 : 1] = replacement;
if (replacement)
replacement->m_chain[i ? 0 : 1] = this->m_chain[i];
if (replacement->m_chain[i])
replacement->m_chain[i]->m_chain[i ? 0 : 1] = replacement->m_chain[i ? 0 : 1];

replacement->m_chain[i] = this->m_chain[i];
if (replacement->m_chain[i])
replacement->m_chain[i]->m_chain[i ? 0 : 1] = replacement;
} }
else
{
if (this->m_chain[i])
this->m_chain[i]->m_chain[i ? 0 : 1] = this->m_chain[i ? 0 : 1];
}

this->m_chain[i] = nullptr;
} }
} }




+ 16
- 0
src/t/algorithm/avl_tree.cpp View File

@@ -91,6 +91,15 @@ lolunit_declare_fixture(AvlTreeTest)
lolunit_assert_equal(tree.get_count(), 3); lolunit_assert_equal(tree.get_count(), 3);


lolunit_assert_equal(tree.erase(30), true); lolunit_assert_equal(tree.erase(30), true);

int test = 0;

for (auto iterator : tree)
{
test += 10;
lolunit_assert_equal(iterator.key, test);
}

lolunit_assert_equal(tree.get_count(), 2); lolunit_assert_equal(tree.get_count(), 2);
lolunit_assert_equal(tree.insert(30, 1), true); lolunit_assert_equal(tree.insert(30, 1), true);


@@ -98,6 +107,13 @@ lolunit_declare_fixture(AvlTreeTest)
lolunit_assert_equal(tree.insert(20, 1), true); lolunit_assert_equal(tree.insert(20, 1), true);
lolunit_assert_equal(tree.exists(10), true); lolunit_assert_equal(tree.exists(10), true);


test = 0;

for (auto iterator : tree)
{
test += 10;
lolunit_assert_equal(iterator.key, test);
}
} }


lolunit_declare_test(AvlTreeExistence) lolunit_declare_test(AvlTreeExistence)


Loading…
Cancel
Save