Browse Source

avl_tree: minor refactoring for shorter code.

undefined
Sam Hocevar 10 years ago
parent
commit
59b5e10ab3
1 changed files with 28 additions and 77 deletions
  1. +28
    -77
      src/lol/algorithm/avl_tree.h

+ 28
- 77
src/lol/algorithm/avl_tree.h View File

@@ -97,42 +97,32 @@ protected:

bool exists(K key)
{
if (key < this->m_key)
{
if (this->m_child[0])
return this->m_child[0]->exists(key);
else
return false;
}
if (this->m_key < key)
{
if (this->m_child[1])
return this->m_child[1]->exists(key);
else
return false;
}
int i = -1 + (key < this->m_key) + 2 * (this->m_key < key);

return true;
if (i < 0)
return true;

if (this->m_child[i])
return this->m_child[i]->exists(key);

return false;
}

void insert_or_update(K const & key, V const & value)
{
if (key < this->m_key)
int i = -1 + (key < this->m_key) + 2 * (this->m_key < key);

if (i < 0)
{
if (this->m_child[0])
this->m_child[0]->insert_or_update(key, value);
else
this->m_child[0] = new tree_node(key, value);
this->m_value = value;
}
else if (this->m_key < key)
else
{
if (this->m_child[1])
this->m_child[1]->insert_or_update(key, value);
if (this->m_child[i])
this->m_child[i]->insert_or_update(key, value);
else
this->m_child[1] = new tree_node(key, value);
this->m_child[i] = new tree_node(key, value);
}
else
this->m_value = value;
}

void update_balance(tree_node * node)
@@ -183,45 +173,21 @@ protected:
if (key < this->m_key)
{
if (this->m_child[0]->get_balance() == 2)
this->rotateLL();
if (this->m_child[0]->get_balance() == -2)
this->rotateLR();
this->m_child[0] = this->m_child[0]->rotate(CCW);
else if (this->m_child[0]->get_balance() == -2)
this->m_child[0] = this->m_child[0]->rotate(CW);
}
else if (this->m_key < key)
{
if (this->m_child[1]->get_balance() == 2)
this->rotateRL();
if (this->m_child[1]->get_balance() == -2)
this->rotateRR();
this->m_child[1] = this->m_child[1]->rotate(CCW);
else if (this->m_child[1]->get_balance() == -2)
this->m_child[1] = this->m_child[1]->rotate(CW);
}
else
ASSERT(false) // Do not rebalance the "this" node here
}

void rotateLL()
{
tree_node * newhead = this->m_child[0]->rotate(CCW);
this->m_child[0] = newhead;
}

void rotateLR()
{
tree_node * newhead = this->m_child[0]->rotate(CW);
this->m_child[0] = newhead;
}

void rotateRL()
{
tree_node * newhead = this->m_child[1]->rotate(CCW);
this->m_child[1] = newhead;
}

void rotateRR()
{
tree_node * newhead = this->m_child[1]->rotate(CW);
this->m_child[1] = newhead;
}

enum Rotation { CW = 0, CCW = 1 };

tree_node * rotate(Rotation rotation)
@@ -322,13 +288,13 @@ protected:

if (this->get_balance() == -1)
{
replacement = this->get_deeper_previous();
replacement = this->get_deeper(0);
if (replacement)
this->get_parent(replacement)->m_child[1] = replacement->m_child[0];
}
else // this->get_balance() >= 0
{
replacement = this->get_deeper_next();
replacement = this->get_deeper(1);
if (replacement)
this->get_parent(replacement)->m_child[0] = replacement->m_child[1];
}
@@ -351,36 +317,21 @@ protected:
to->m_child[1] = nullptr;
}

tree_node * get_deeper_previous()
tree_node * get_deeper(int index)
{
tree_node * previous = this->m_child[0];
tree_node * previous = this->m_child[index];

if (previous)
{
while (previous->m_child[1])
while (previous->m_child[1 - index])
{
previous = previous->m_child[1];
previous = previous->m_child[1 - index];
}
}

return previous;
}

tree_node * get_deeper_next()
{
tree_node * next = this->m_child[1];

if (next)
{
while (next->m_child[0])
{
next = next->m_child[0];
}
}

return next;
}

int get_balance()
{
return this->m_stairs[1] - this->m_stairs[0];


Loading…
Cancel
Save