【问题标题】:Deleting all from trie tree从特里树中删除所有内容
【发布时间】:2014-03-26 23:39:43
【问题描述】:

当我从树中删除所有节点时,我似乎总是遇到麻烦。我正在尝试释放我在创建 trie 树时分配的所有内存。

我想创建一个函数 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;
}

显然这些都不起作用,否则我不会在这里:)。

其他问题。如果我的析构函数是这样实现的,我是否必须在我的主函数中调用 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;

【问题讨论】:

  • 你可以为你的 NodePtr 结构/类发布代码吗?

标签: c++ trie removeall


【解决方案1】:

只删除根是不够的:删除根时,要检查其子节点是否不为空,如果不为空,则递归删除。 C++ 没有垃圾收集器来为您完成工作:)

如果您的 remove_all 方法在包装对象的析构函数中,那么您不必单独调用它。

【讨论】:

    【解决方案2】:

    您应该在所有要在运行时删除的类中编写一个删除方法。 因此,您可以在不关心垃圾收集的情况下删除一棵树。 这样使用指针很容易:

        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;
        }; 
    

    回答您的问题:不,删除 root 是不够的。

    编辑:对不起,我在 a:init() 处犯了一个错误。我忘了取消引用指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 2018-09-04
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      相关资源
      最近更新 更多