void initTrie(bool v){ vOption = v; words = NULL; endOfWord = NULL; root = NULL; clearTrie(); }
void deleteTrie(void){ clearTrie(); free(words); free(endOfWord); reservedWords = 0; numberOfWords = 0; }
void clearTrie(Trie *p)//清空整棵字典树 { if(p) { for(int i = 0; i < 26; i++) clearTrie(p->next[i]); delete p; } }
void clearTrie(TrieNode *&root) { if (root == NULL) { return; } int i; for (i = 0; i < TrieNode::N; ++i) { clearTrie(root->child[i]); } root->child.clear(); delete root; root = NULL; }
//jeżeli należy to usuwa node'a void deleteNode(Node *node){ assert(node != NULL); if(node->numberOfWord != NO_END_OF_WORD) endOfWord[node->numberOfWord] = NULL; node->numberOfWord = NO_END_OF_WORD; if(node->numberOfSons == 0) removeLeaf(node); else if(node->numberOfSons == 1) joinFatherWithOnlySon(node); if(numberOfNodes < 2) clearTrie(); }
/** * @param board: A list of lists of character * @param words: A list of string * @return: A list of string */ vector<string> wordSearchII(vector<vector<char> > &board, vector<string> &words) { v.clear(); us.clear(); ans.clear(); vector<vector<char> > &b = board; n = b.size(); m = n ? b[0].size() : 0; if (!(n || m)) { return ans; } TrieNode *root = new TrieNode(); for (auto it = words.begin(); it != words.end(); ++it) { insertWord(root, *it); } string s = ""; v.resize(n, vector<bool>(m, false)); int i, j; for (i = 0; i < n; ++i) { for (j = 0; j < m; ++j) { v[i][j] = true; s.push_back(b[i][j]); DFS(i, j, s, root->child[b[i][j] - 'a'], b); s.pop_back(); v[i][j] = false; } } for (auto it = us.begin(); it != us.end(); ++it) { ans.push_back(*it); } clearTrie(root); return ans; }
void initTrie() { clearTrie(root); root = new root; }