Сегментация неисправности бинтри

0

Я пытаюсь реализовать bintree, но у меня проблемы с методом insert. Если я добавлю первый элемент, программа не сработает, но, когда я представим 2 или более элемента, сбой программы.

Это код

template <typename T>
void Arbol<T>:: insertar( T c){
    if(laraiz==0)
    {
        laraiz=new celdaArbol;
        laraiz->elemento=c;
        laraiz->padre=laraiz->hizqu=laraiz->hder=0;
    }
    else {
        celdaArbol *com=laraiz;
        bool poner=false;
        while(poner==false){
            if(c>com->elemento){
                if(com->hder==0){
                    com->hder= new celdaArbol;
                    com->hder->elemento=c;
                    com->hder->padre=com;
                    poner=true;
                }
                else{
                    com=com->hder;
                }
            }
            else {
                if(com->hizqu==0){
                    com->hizqu= new celdaArbol;
                    com->hizqu->elemento=c;
                    com->hizqu->padre=com;
                    poner=true;
                }
                else {
                    com=com->hizqu;
                }
            }
        }
    }
}

Я думаю, что проблема в другом:

else{
    com=com->hizqu; //com=com->hder;
}

Потому что я видел в отладчике, что программа вводит несколько раз в раздел и не должна делать.

  • 0
    Я думаю, что было бы гораздо выгоднее использовать английские имена переменных и типов, независимо от того, что вы говорите на другом языке ... Таким образом, вы эффективно отговариваете людей, которые не говорят на вашем языке (испанском?), Даже взглянуть на код. Чтение с ++ довольно сложно, и если эта трудность воспринимается другим языком, это может быть очень ... вы знаете ...
  • 0
    Почему все остальное? Использование возвращает и продолжает делать код чище.
Показать ещё 1 комментарий
Теги:
binary-tree

2 ответа

1
Лучший ответ

Согласно этому коду:

laraiz->padre=laraiz->hizqu=laraiz->hder=0;

Вы не правильно инициализировать указатели hizqu и hder к nullptr в конструкторе celdaArbol класса. И вы не инициализируете их ни в одной из ветвей if(c>com->elemento){ поэтому они, похоже, имеют значения мусора.

Кроме того, ваш код может стать более читаемым и менее подвержен ошибкам при использовании правильных конструкций C++:

    celdaArbol *com=laraiz;
    while( true ){
        celdaArbol *&ptr = c > com->elemento ? com->hder : com->hizqu;
        if( ptr  ) {
            com = ptr;
            continue;
        }
        ptr = new celdaArbol;
        ptr->elemento=c;
        ptr->padre=com;
        ptr->hder = ptr->hizqu = nullptr;
        break;
    }

Этот код логически равен вашему, за исключением того, что он короче, легче читается, избегает дублирования и исправляет вашу ошибку.

  • 0
    У меня проблема с этим кодом, когда я пытаюсь прочитать элемент, который есть у ptr в его отце, если я вставлю 5,6,15 15, отец - это 5, а не 6. Если я использую debbuger, программа никогда не входит в if (ptr ) {com = ptr; Продолжить; } Я не знаю почему, потому что если com-> hder равен 6, ptr не равен nullptr
  • 0
    Я использовал свой код с nullptr, и он работает нормально.
Показать ещё 1 комментарий
0

Для каждого листового узла (кроме корня дерева) вы никогда не инициализируете левый дочерний или правый дочерний узел не как неопределенное значение.

Вы, вероятно, хотели инициализировать их как nullptr.

Вот один пример:

if (com->hizqu==0){
    com->hizqu = new celdaArbol;
    com->hizqu->elemento = c;
    com->hizqu->padre = com;
    poner = true;

    // What is the value of com->hizqu->hizqu?
    // What is the value of com->hizqu->hder?
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню