2014-02-25 102 views
0

當我從樹上刪除所有節點時,我似乎總是陷入麻煩。我試圖釋放所有在創建特里樹時分配的內存。刪除特里樹的所有內容

我想創建一個函數REMOVE_ALL

是否足夠只刪除「根」

是這樣的:

void PrefixStringSet::remove_all(NodePtr node) 
    { 
     delete root; 

    } 

還是我必須刪除每個節點用這樣的事情:

void PrefixStringSet::remove_all(NodePtr node) 
{ 
    if(!root) 
    { 
     return; 
    } 
    remove_all(root->children); 


    delete root; 
} 

很明顯,這些都沒有工作,或者我wouldn在這裏:)。

其他問題。我必須調用REMOVE_ALL功能在我的主要功能,如果我的析構函數中實現這樣

PrefixStringSet::~PrefixStringSet() 
{ 
    remove_all(root); 
} 

抑或析構函數自動刪除樹/節點創建?

編輯

struct TrieNode 
{ 
    TrieNode(bool present = false); 
    bool is_leaf(); 

    bool present; 
    TrieNode* children[ALPHABET_SIZE]; 
}; 

class PrefixStringSet 
{ 
    public: 
     // Creates an empty prefix string set. 
     PrefixStringSet(); 

     ~PrefixStringSet(); 

     bool insert(string s); 

     bool contains(string s); 

    private: 
     NodePtr root; 
     void remove_all(NodePtr node); 
}; 
    typedef TrieNode* NodePtr; 
+0

你可以爲你發佈代碼NodePtr結構/類嗎? –

+0

檢查編輯, – user3265963

回答

1

只刪除根是不夠的:在刪除根時,應檢查其是否孩子不爲空,如果他們不爲空,遞歸地刪除它們。 C++沒有垃圾回收器來爲你完成工作:)

如果你的remove_all方法在包裝器對象的析構函數中,那麼你不必單獨調用它。

1

你應該在你想要在運行時刪除的所有類中編寫一個remove方法。 所以你可以刪除一個沒有多少關心垃圾回收的樹。 人們很容易以這種方式使用指針:

class a 
    { 
     public: 
     a(){} 
     ~a(){remove();} 
     init(int v){ 
      var = new int; 
      *var=v; } 
     remove(){delete var;} 

     private: 
     int *var; 
    }; 

    class b 
    { 
     public: 
     b(){} 
     ~b(){remove();} 
     init(int v){ 
      var = new a; 
      var->init(v); } 
     remove(){ 
      var->remove(); 
      delete var; } 

     private: 
     a *var; 
    }; 

要回答你的問題:沒有,刪除根是不夠的。

編輯:sry我犯了一個錯誤:init()。我忘了取消指針。