2013-04-11 6 views
0

хочет написать деструктор для бинарного дерева поиска (его предполагается удалить все узлы дерева) вот что я получил до сих порбинарные деревья поиска код

virtual ~BST() { 
    BSTNode<Data>* node = root; 
    if (node == NULL){ 
    return; 
    }else if (node->left) { 
     while(node->left){ 
     delete node; 
     } 
    }else if (node->right){ 
     while(node->right) 
     delete node; 
    } 
     isize = 0; 
} 

я знаю, однако там что-то не так с код, как я могу его исправить

+0

Покажите нам класс BST и класс BSTNode. – 2013-04-11 22:15:31

ответ

1

Когда вы делаете, например,

while(node->left){ 
    delete node; 
} 

Вы удаляете узел, но на самом деле не выполняете цикл до следующего. Поэтому в следующий раз в цикле node не будет NULL, поэтому вы разыщите нераспределенную структуру данных, которая является неопределенным поведением и может привести к сбою. И затем вы пытаетесь удалить тот же nodeснова, который по-прежнему является неопределенным поведением и может, безусловно, привести к сбою.

Вы также не удаляете как левый и правый узлы, только один из них связан с else.

Я предлагаю вам поставить правильный деструктор в BSTNode который удаляет свои собственные ребенок:

template<typename T> 
BSTNode<T>::~BSTNode() 
{ 
    delete left; 
    delete right; 
} 

Тогда деструктор дерева будет просто:

BST::~BST() 
{ 
    delete root; 
} 
3

Потерять else с. В противном случае, если дерево имеет left. right не удаляется.

Потерять while. Узлы должны иметь свои собственные деструкторы и должны удаляться рекурсивно.

Окончательно потеряйте if s. Потому что delete NULL действителен.

virtual ~BST() { 
    BSTNode<Data>* node = root; 
    if (node == NULL){ 
    return; 
    } 
    delete node->left; 
    delete node->right; 
    isize = 0; 
} 
+0

Это может удалить только детей, оставшихся без корней, оставив остальную часть дерева «на ветру», так сказать. –

+0

Право, вот что я думал, но мне нужен тот, который удаляет все узлы – cloud9resident

+1

@JoachimPileborg Ya Не совсем понятно, как он реализовал отношения между BST и BSTNode. Я попросил его показать, но он этого не сделал. Я предполагаю здесь, что, поскольку он ушел и вправо в узле, эти узлы также имеют левый и правый. Я имею в виду, что BST - это просто обертка вокруг фактической древовидной структуры. Но опять же я не уверен. Это может быть неправильным. Вот почему я упомянул ему, что узлы должны иметь свои собственные деструкторы и удалять рекурсивно. – 2013-04-11 22:37:19

3
void BST::deleteNode(BSTNode<Data> *node) { 
    if (node) { 
     deleteNode(node->left); 
     deleteNode(node->right); 
     delete node; 
    } 
} 

BST::~BST() { 
    deleteNode(root); 
} 
+0

удалит все узлы рекурсивно, а не только сразу узлы? – cloud9resident

+1

@ cloud9resident Да, похоже, он правильно удалит всех детей. –