Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2011, 07:15   #1
CodeNOT
Форумчанин
 
Аватар для CodeNOT
 
Регистрация: 08.11.2010
Сообщений: 593
По умолчанию Удаление узла из красно-черного дерева

Здравствуйте, в общем столкнулся с проблемой, при удалении элемента из красно-черного дерева и при следующем обходе возникает ошибка, а именно то, что я пытаюсь обратиться к не той памяти, причем вылетает именно при обходе, использовал отладчик, но не смог найти ошибку, не мог ли бы подсказать в каком месте у меня руки стали расти не из того места?
вот процедура удаления:
Код:
void Dell_Element(Tree Del)
{
        Tree HelpRb1,HelpRb2;
        if(!Del || Del==NULL)return;
        if(Del->Left==NULL||Del->Right==NULL)
        {
                HelpRb2=Del;
        }else
        {
                HelpRb2=Del->Right;
                while(HelpRb2->Left!=NULL) HelpRb2=HelpRb2->Left;
        }
        if(HelpRb2->Left!=NULL)
        {
                HelpRb1=HelpRb2->Left;
        }else
        {
                        if(HelpRb2->Right!=NULL)
                        {
                        HelpRb1=HelpRb2->Right;
                        }
        }
        HelpRb1->Parent=HelpRb2->Parent;
                if(HelpRb2->Parent)
                {
                        if(HelpRb2==HelpRb2->Parent->Left)
                        {
                                HelpRb2->Parent->Left=HelpRb1;
                        }else
                        {
                                HelpRb2->Parent->Right=HelpRb1;
                        }
                }else
                {
                        Root=HelpRb1;
                }
                if(HelpRb2!=Del)
                {
                        Del->Data=HelpRb2->Data;
                }
                if(HelpRb2->Color==0)
                {
                        Balance_AfterDel(HelpRb1);
                }
              delete(HelpRb2);
}
Переменная Del - это как раз удаляемый узел

Вот процедура обхода дерева:

Код:
void WalkTree(Tree Root,int Count)
{
        if(Root!=NULL)
        {

                WalkTree(Root->Right,Count+1);
                for(int i=0;i<=Count+1;i++) cout<<"      ";
                cout<<Root->Data;
                 if(Root->Color==1){cout<<"(RED)";}
                if(Root->Color==0){cout<<"(BLACK)";}
                cout<<"\n";
                WalkTree(Root->Left,Count+1);

        }
}
Вылетает при обращении к правому поддереву WalkTree(Root->Right,Count+1); до левого он не доходит, по-этому сказать не могу)
Алгоритм удаление использовал из Кормена

Последний раз редактировалось CodeNOT; 18.05.2011 в 07:31.
CodeNOT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в С++ вместо черного фона вставить картинку. dani6 Общие вопросы C/C++ 1 26.01.2011 19:31
удаление узлов из дерева ArniLand Общие вопросы по Java, Java SE, Kotlin 0 22.09.2010 21:36
Trie-деревья. Удаление из дерева слов. Katya3636 Помощь студентам 8 25.05.2010 23:59