Бинарное дерево C++

253
19 декабря 2016, 19:55

У меня есть входной файл

    0 0 7
    7 0 25
    7 1 12
    25 0 18
    25 1 3
    18 0 6 
    12 0 22
    12 1 8

По этому файлу строится бинарное дерево. Первая цифра обозначает значение родителя, если она равна 0, то это корень. Вторая цифра говорит будет новый элемент справа или слева (0 или 1). Третий символ это значение нового узла. Метод добавления элемента

void add(ONode *&tree, int val, int left = NULL) {
    if(tree == NULL) {
        tree = new ONode;
        tree->val = val;
        tree->left = tree->right = NULL;
    }
    else {
        (left == 1) ? add(tree->right, val) : add(tree->left, val);
    }
}

И само добавление

 while(!feof(input)) {
        int p, l, v;
        fscanf(input, "%d %d %d", &p, &l, &v);
        if(p == 0) add(a, v);
        else {
            ONode *t = NULL;
            t = search(a, p);
            add(t, v, l);
        }
    }

Но всё рушится когда пытаюсь добавить 18 в дерево, с выводом

Первый этап обработки исключения по адресу 0x00CF3E21 в ConsoleApplication12.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFDFDFE01. Необработанное исключение по адресу 0x00CF3E21 в ConsoleApplication12.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFDFDFE01.

в чём может быть дело ?

Answer 1

Первое, что нужно сделать это поставить брекпоинт и запустить отладчик (так найдётся место на котором вылет...)

  1. почему вы после создания потомка (7-0-25 или 7-1-12) у родителя (7) не меняете адреса left и right? (они так и остаются равные "0" )
  2. как после выше описанного сможет отработать функция search? Да и ещё вернуть "что-то" куда потом вставить val

вот вам и ошибка доступа...

Answer 2

Решение: проблема была в функции search.

READ ALSO
Открытия приложения VISIO из программы на C++

Открытия приложения VISIO из программы на C++

Задача следующая на visual C++Код программы не требуется! Прочтите внимательно, может кто знает, или укажет, где посмотреть, куда обратиться

242
Граф в виде списка смежностей

Граф в виде списка смежностей

UPD: Переписал код и не пойму, почему вылетает на for(j = gr[i]list

253
Пропускает ввод данных

Пропускает ввод данных

Помогите исправить ошибку в коде:

311
Разбор заголовка пакета(C++, sockets)

Разбор заголовка пакета(C++, sockets)

Есть генератор UDP пакетов и снифферКогда сниффер ловит нужный пакет , сохраняю его содержимое в файл

237