2014-01-04 6 views
0

Попытка реализовать метод deleteTree в C++. Этот метод берет корень дерева как параметр и, следовательно, должен удалять все узлы от корня до листа. Мой код кажется логически правильным, однако я получаю бесконечный цикл каждый раз, когда я его запускаю. Может ли кто-нибудь определить, что не так?Удаление всех узлов в дереве - C++

template <class A, class B> void Tree<A,B>::deleteTree(Node<A,B>* rootNode) { 
    if (rootNode->left != NULL) { 
     deleteTree(rootNode->left); 
    } 
    if (rootNode->right != NULL) { 
     deleteTree(rootNode->right); 
    } 
    free(root); 
} 
+0

У вашего дерева есть круг? – thumbmunkeys

+1

Зачем использовать 'free' вместо' delete'? Используете ли вы 'malloc' вместо' new'? Или 'free' - это функция, которую вы написали? –

+0

@ thumbmunkeys, это было бы довольно интересным деревом – Leeor

ответ

2

Ваш код никогда не освобождает любой узел, кроме root, но несколько раз. Также после этого вам нужно установить указатель на NULL. free не сделает это за вас.

Однако это не совсем объясняет поведение. Я бы ожидал ошибки сегментации. (Ну на самом деле это вызывает неопределенное поведение). Вероятно, вы случайно создали цикл на графике.

Также free не будет называть деструктор, который может иметь непреднамеренные побочные эффекты. Вместо этого вы должны использовать new/delete или попробовать какую-то структуру данных, которая вообще не требует ручного распределения.

+0

это не так, из-за рекурсии – thumbmunkeys

+0

Он прав, корень здесь не определен, он должен освобождать rootNode. Хорошо поймал! – Leeor

+0

@thumbmunkeys Единственный бесплатный frees 'root', который, кажется, является членом' Tree ' – Nabla

Смежные вопросы