2014-10-28 107 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運營商。

如果您要刪除節點,則不需要將其數據成員歸零。在扔掉垃圾之前不需要擦亮垃圾。