Browse Source

avl_tree: bug fix on chain insertion/deletion.

undefined
Guillaume Bittoun Sam Hocevar <sam@hocevar.net> 10 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_child[0] = nullptr;
this->m_child[1] = nullptr;
this->m_chain[0] = nullptr;
this->m_chain[1] = nullptr;
}

void replace_chain(tree_node * replacement)
{
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.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.insert(30, 1), true);

@@ -98,6 +107,13 @@ lolunit_declare_fixture(AvlTreeTest)
lolunit_assert_equal(tree.insert(20, 1), 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)


Loading…
Cancel
Save