Red Black Tree удалить неисправность в C - PullRequest
0 голосов
/ 08 января 2012

Я почти закончил красное черное дерево, но мое удаление работает неправильно. Может удалить узел, а может нет. После того, как я удаляю корень и нажимаю опцию печати, мой экран становится спамом от узлов, которые у меня уже есть в дереве. в тестовом дереве 2,1,7,5,8,11,14,15,4, если я удаляю root=7 и нажимаю по порядку печать, я получаю 2,4,5,8,1,2,4,5,8,1,..... и так далее до тех пор, пока не произойдет сбой программы. Если я удаляю 2, программа мгновенно падает. Узел 11 удаляет нормально, как и все листья, как 1-4-15. Я пытался найти проблему с отладкой, но все, кажется, работает нормально. Код основан на введении Кормена в алгоритмы. Спасибо!

void RB_delete(struct node* z,struct node* y) //delete z y=z on call
{
    struct node *x;
    enum type originalcolor;         //x  moves into y's original position
    originalcolor=y->color;     // Keep track of original color

        if (z->LC==nill)        //case 1: (z has no LC)
        {
            x=z->RC;
            RB_transplant(z,z->RC); 
        else if (z->RC==nill)           //case 2: z has LC but no RC
        {
            x=z->LC;
            RB_transplant(z,z->LC);
        }
        else            // two cases: z has both Children
        {
            y=tree_minimum(z->RC);      //find  successor
            originalcolor=y->color;     //save color of successor
            x=y->RC;
                if (y->P==z)    //successor has no LC cause its nill
                    x->P=y;
                else
                {
                    RB_transplant(y,y->RC);
                    y->RC=z->RC;
                    y->RC->P=y;
                }
            RB_transplant(z,y);
            y->LC=z->LC;
            y->LC->P=y;
            y->color=z->color;
        }
        if (originalcolor == black)
            RB_delete_fix(x);
        free(z);
}

void io_print(struct node *aux,struct node *auxnill)
{
    HANDLE  hConsole;
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    if(aux != auxnill)
    {
        io_print(aux->LC,auxnill);
        if (aux->color==red)
        {
            SetConsoleTextAttribute(hConsole, 12);
            printf("%d,\n",aux->key);fflush(stdout);
            SetConsoleTextAttribute(hConsole, 15);
        }
        if (aux->color==black)
        {
            SetConsoleTextAttribute(hConsole, 9);
            printf("%d,\n",aux->key);fflush(stdout);
            SetConsoleTextAttribute(hConsole, 15);
        }
            io_print(aux->RC,auxnill);
    }
}

1 Ответ

0 голосов
/ 09 января 2012

Что ж, в трансплантате было единственное неправильное место указателя ... И я не смог его найти, потому что не уделял много внимания.у меня было:

void RB_transplant(struct node *aux,struct node *auxchild)  //replace the subtree rooted at node aux with the subtree rooted at aux-LC or aux->RC
{
    if (aux->P==nill)                           //if aux=root child becomes root
        root=auxchild;
    else if (aux==aux->P->LC)               //if child is a LC
        aux->P->LC=auxchild;                
    else aux->P->RC=auxchild;                   //if child is RC //connect grandparent's->RC with child
        auxchild->P=aux->P;                         //connect child to point to parent
}

и проблема была в строке 5, где aux был => auxhild ... Проблема решена:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...