Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从trie树中删除所有_C++_Trie_Removeall - Fatal编程技术网

C++ 从trie树中删除所有

C++ 从trie树中删除所有,c++,trie,removeall,C++,Trie,Removeall,从树中删除所有节点时,我似乎总是遇到麻烦。我试图释放创建trie树时分配的所有内存 我想创建一个函数remove\u all 仅仅删除“根”就足够了吗 大概是这样的: void PrefixStringSet::remove_all(NodePtr node) { delete root; } void PrefixStringSet::remove_all(NodePtr node) { if(!root) { return;

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

我想创建一个函数remove\u all

仅仅删除“根”就足够了吗

大概是这样的:

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

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


   delete root;
}
或者我必须用如下方式删除每个节点:

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;

仅删除根目录是不够的:删除根目录时,应检查其子目录是否为空,如果子目录不为空,则递归删除它们。C++没有垃圾回收器来为你工作:
如果remove_all方法在包装器对象的析构函数中,则不必单独调用它。

您应该在运行时要删除的所有类中编写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我在a:init()上犯了一个错误。我忘了删除指针。

您能为NodePtr struct/class发布代码吗?