2013-04-28 89 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荷兰国际集团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-> right中,我没有删除nodePtr。您可以请发布解决方案吗?谢谢。 – 2013-04-28 00:18:33

+0

'delete nodePtr;'只有当nodePtr是一片叶子时才会发生,不是吗?但你不要让它的父母成为一片叶子。 – Elazar 2013-04-28 00:21:24

+0

但不删除nodePtr本质上是使左侧或右侧自动为NULL? – 2013-04-28 00:36:20