2014-10-28 3 views
0

Ниже я опубликовал код, который я пытаюсь использовать для создания деконструктора для двоичного дерева поиска. Если я удалю попытки связать родителей с NULL до удаления узла, код будет работать отлично (он не будет работать вечно и правильно удалит узлы). Однако из того, что я должен понимать, указатели теперь указывают на данные мусора, а не на NULL. Как я могу исправить это или что не так с моей попыткой исправить это? (Ошибка, которую я получаю, «не может прочитать память»).Binary Search Tree Deconstructor

int BinarySearchTree::postOrderTreeDelete(PhoneInfo * x) 
{ 
    static int counter = 0; 

     if (x == NULL) 
     { 
      return counter; 
     } 

     else 
     { 
      postOrderTreeDelete(x->getLeft()); 
      postOrderTreeDelete(x->getRight()); 

      //deleten(x); 
      if (x == x->getParent()->getLeft()) 
       x->getParent()->setLeft(NULL); 
      else if (x == x->getParent()->getRight()) 
       x->getParent()->setRight(NULL); 

      delete x; 
      counter++; 
     } 
     postOrderTreePrint(); 
     return counter; 
} 
+0

Что произойдет, если дерево имеет, скажем, всего 2 или 3 уровня? Вы использовали ваш отладчик для отладки проблемы? – PaulMcKenzie

+1

Упоминание «postOrder» в имени функции бессмысленно, так как это единственный разумный способ удалить дерево. – ooga

ответ

0

Если вы все равно уничтожаете дерево, зачем создавать все промежуточные этапы дерева, когда вы идете?

Просто это должно быть достаточно:

int BinarySearchTree::postOrderTreeDelete(PhoneInfo * x) 
{ 
    if (!x) 
    { 
     return 0; 
    } 
    else 
    { 
     int counter = 1; // for x 
     counter += postOrderTreeDelete(x->getLeft()); 
     counter += postOrderTreeDelete(x->getRight()); 

     delete x; 
     return counter; 
    } 
} 
0

Вы должны написать это в деструктор, и избавиться от возвращаемой графа в целом:

BinarySearchTree::~BinarySearchTree() 
{ 
    delete _left; 
    delete _right; 
} 

Затем абонент просто должен использовать Оператор delete.

Если вы удаляете узел, нет необходимости также обнулять его элементы данных. Не нужно полировать мусор, прежде чем выбросить его.

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