Удаление элемента из дерева

322
13 ноября 2017, 21:34

Не получается удалить слово из нагруженного дерева. Смотрю в дебаге, на последнем узле слова адреса в каждой ячейке массива не NULL и bool не равен false. Из за этого не хочет работать, а как по другому удалить пока не придумал.

    class TrieTree {
    static const int ALP = 26;
    struct Node{
        Node *floor[ALP];
        bool end_Word;
    };
    struct Node *getNode(){
        Node *node = new Node;
        node->end_Word = false;
        for (int i = 0; i < ALP; i++)
        {   
            node->floor[i] = NULL;
        }
        return  node;
    }
    struct Node *root;
public:
    TrieTree(){
        root = getNode();
    }
    void add(std::string str){
        add(root,str);
    }
    void del(std::string str){
        del(root,str);
    }
    bool search(std::string str){
        return search(root,str);
    }
private:
    void add(Node *node, std::string str){
        for (int i = 0; i < str.size(); i++)
        {  
           if(!node->floor[str[i] -'a']){
               node->floor[str[i] -'a'] = getNode();
           } 
           node = node->floor[str[i] -'a'];
        }
        node->end_Word = true;
    }
    bool search(Node *node, std::string str){
        for (int i = 0; i < str.size(); i++)
        { 
            if(!node->floor[str[i] -'a']) return false;
            node = node->floor[str[i] -'a'];
        }
        return (node != NULL && node->end_Word);
    }
    bool onWords(Node *node){
        for(int i = 0; i < ALP; i++)
        {
            if(node->floor[i]) return false;
        }
        return true;
    }
    bool leafNode(Node *node){
        return (node->end_Word != false);
    }
    bool delHelp(Node *node, std::string str,int level, int len){
        if(node)
        {
            if (level == len)
            {
                if (node->end_Word)
                {
                    node->end_Word = false;
                    if(onWords(node))
                    {
                        return true;
                    }
                    return false;
                }
            }
            else
            {
                int index = str[level]-'a';
                if (delHelp(node->floor[index],str,level+1,len) )
                {
                    delete node->floor[index];
                    return (!leafNode(node) && onWords(node));
                }
            }
        }
        return false;
    }
    void del(Node *node, std::string str){
        int len = str.size();
        if( len > 0) {
            delHelp(node,str,0,len);
        }
    }
};
READ ALSO
Две параллельные таблички в С++ [требует правки]

Две параллельные таблички в С++ [требует правки]

Суть проблемы такова, требуется нарисовать правила игры (в консоле) в левой стороне, а справа нарисовать поле игры

230
Имеет ли смысл выделять память под объект Mat в куче?

Имеет ли смысл выделять память под объект Mat в куче?

Добрый деньТолько начинаю работать с библиотекой opencv, в связи с чем возник вопрос: Лучше объявлять указатели Mat или же сами объекты?т

205
Как отправить / получить структуру в boost :: asio

Как отправить / получить структуру в boost :: asio

Я собирался отправить структуру с клиента на сервер, используя boost :: asio :: async_write_some, в этом случае boost :: serialization приходит на помощь:

288
Чтение текста из файла

Чтение текста из файла

Не могу никак дойти до разумного решения данной проблемы, пытался использовать ifstream, fopen

239