Вставка для крепления красно-черного дерева

Я создаю свою собственную структуру карты (необходимую для класса), используя дерево RB. Из того, что я узнал о вставке, нам нужно обработать 3 случая. Я использую эту реализацию . Тем не менее, я получаю нарушение памяти после вставки 3-го значения (и любого другого) при исправлении древовидной структуры RB. Как мне поступить в этом случае?

Ребенок вставляется:

Изображение

Итак, вот моя реализация:

struct Node
{
    pair<int,int> key;
    int Value;
    Node *LeftNode;
    Node *RightNode;
    Node *Parent;
    bool color;                 // 0 - black 1 - red
};

class Map
{
    int size;

public:
    Map();
    void insert(pair<int,int>, int);

private:
    void RotateLeft(Node*);
    void RotateRight(Node*);
    void InsertNode(Node*, pair <int,int>, int);
    void RestoreColor(Node*);

    Node* root;
};

void Map::RestoreColor(Node* child)
{
    while( child->Parent!=root && child->Parent->color==1 )
    {
        if(child->Parent == child->Parent->Parent->LeftNode)            
        {
            Node* uncle = child->Parent->Parent->RightNode;

            if(uncle->color == 1)                                       
            {
                child->Parent->color = 0;
                uncle->color = 0;
                child->Parent->Parent->color = 1;
                child = child->Parent->Parent;
            }else
            {
                if(child = child->Parent->RightNode)                    
                {
                    child = child->Parent;
                    RotateLeft(child->Parent);
                }
                child->Parent->color = 0;
                child->Parent->Parent->color= 1;
                RotateRight(child->Parent->Parent);
            }
        }else
        {
            if(child->Parent == child->Parent->Parent->RightNode)
            {
                Node* uncle = child->Parent->Parent->LeftNode;

                if(uncle->color == 1)                                                           {
                    child->Parent->color = 0;
                    uncle->color = 0;
                    child->Parent->Parent->color = 1;
                    child = child->Parent->Parent;
                }else
                {
                    if(child = child->Parent->LeftNode)                 
                    {
                        child = child->Parent;
                        RotateRight(child->Parent);
                    }
                    child->Parent->color = 0;
                    child->Parent->Parent->color= 1;
                    RotateLeft(child->Parent->Parent);
                }
            }
        }
        root->color=0;
    }
};

Нарушение происходит при доступе uncle, где в данном примере uncle равно null. Как изменить функцию?


person Ghostli    schedule 13.04.2013    source источник


Ответы (2)


Вы используете реализацию, которая зависит от узлов-сторожей как конечных узлов, так что у вас всегда есть черный узел, который вы можете разыменовать в подобных случаях. Чтобы изменить его, вам нужно будет изменить такие строки, как

if(uncle->color == 1)   

To

if((uncle != NULL) && (uncle->color == 1))

Затем он примет предложение «else», как и должно быть, как и в дозорной версии, цвет всегда будет черным в случае, когда у вас будет нулевой указатель в не дозорной версии.

person Community    schedule 09.02.2014

RotateLeft(child->Parent);

RotateRight(child->Parent);

Shouldn't the the above in your code be

RotateLeft(child) и RotateRight(child) соответственно.

person Anurag Arora    schedule 21.10.2016