2014-10-28 111 views
0

下面我发布了我正在尝试使用的代码来为二叉搜索树创建解构器。如果我在删除节点之前消除了将父节点链接到NULL的尝试,代码将完美运行(它不会永远运行并正确地删除节点)。但是,从我所了解的指针现在指向垃圾数据而不是NULL。我该如何解决这个问题,或者我尝试解决这个问题时出了什么问题? (我得到的错误是“无法读取内存”)。二进制搜索树解构器

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 2014-10-28 21:48:14

+1

在函数名中提到“postOrder”是毫无意义的,因为这是删除树的唯一合理方法。 – ooga 2014-10-28 21:48:19

回答

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运营商。

如果您要删除节点,则不需要将其数据成员归零。在扔掉垃圾之前不需要擦亮垃圾。