2013-04-28 3 views
0

Этот код имеет ошибку времени выполнения, и у меня возникают проблемы с определением проблемы. класс стека имеет базовые операции стека (pop push top) и используется для сохранения местоположения обхода.нерекурсивный деструктор для двоичного дерева поиска путем реализации стека

parityBST::~parityBST() 
{ 

    if (root == NULL) 
    { 
     return; 

    } 
    else 
    { 
     //postOrder non recursive traversal for destructor 
     stack* s1 = new stack(); 
     s1->push(root); 

     binaryNode* nodePtr= root; 
     while (!s1->isEmpty()) 
     { 
      //RUNTIME ERROR HERE (after several iterations) 
      if (nodePtr->left) 
      { 
       s1->push(nodePtr->left); 
       nodePtr = nodePtr->left; 
      } else if (nodePtr->right) 
      { 

       s1->push(nodePtr->right); 
       nodePtr = nodePtr->right; 
      } else 
      { 

       delete nodePtr; 
       s1->pop(); 
       nodePtr = s1->getTop(); 
      } 

     } 

    } 

} 

ответ

1

delete Вы ING nodePtr в то время как в (родителя nodePtr в) -> слева, но не изменяя его в нуль, так что вы снова входите в него.

пытаются добавить следующее:

s1->pop(); 
binaryNode* parent = s1->getTop() 
if (parent->left==nodePtr) 
    parent->left = NULL; 
else 
    parent->right = NULL; 
delete nodePtr; 
nodePtr = parent; 
+0

Я не совсем понимаю. Я не удаляю nodePtr, а в parent_> nodePtr. Не могли бы вы отправить решение? Благодарю. –

+0

'delete nodePtr;' происходит только в том случае, если nodePtr является листом, не так ли? но вы не делаете своего родителя листом. – Elazar

+0

, но не удаляет nodePtr, по существу, делает левый или правый автоматически NULL? –

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