Я пытался решить вопрос Word Search II на LeetCode, который требует использования Tr ie, чтобы помочь сделать звонки с возвратом более эффективными, и в основном нужно использовать попытки, я пытался реализовать свой собственный tr ie class, но я сталкиваюсь с дорожным блоком в моей функции remove
, для нее требуется копия root, но я не уверен, как ее получить. Вот часть, с которой у меня возникают проблемы:
TrieNode* crawl = root
в функции remove(string word, TrieNode* crawl = root, int depth = 0)
Ошибка: недопустимое использование non-stati c data member ' Тр ie :: root '
Я не знаю, как правильно это сделать.
TrieNode* remove(string word, TrieNode* crawl = root, int depth = 0) {
if(!crawl) return nullptr;
if(depth == word.size()) {
if(crawl->isLeaf) crawl->isLeaf = false;
if(isEmpty(crawl)) {
delete crawl;
crawl = nullptr;
}
return crawl;
}
int index = word[depth] - 'a';
crawl->arr[index] = remove(word, crawl->arr[index], depth + 1);
if(isEmpty(crawl) && crawl->isLeaf == false) {
delete crawl;
crawl = nullptr;
}
return crawl;
}
Вот как выглядит мой класс Tr ie:
class Trie {
private:
TrieNode* root;
public:
Trie() : root(new TrieNode()) {};
void insert(const string &word) {
auto crawl = root;
// does it's thing
}
bool search(const string &word) {
auto crawl = root;
// does it's thing
}
bool isPrefix(const string &word) {
auto crawl = root;
// does it's thing
}
bool isEmpty(TrieNode* root) {
for(int i = 0; i < 26; i++) if(root->arr[i]) return false;
return true;
}
TrieNode* remove(string word, TrieNode* crawl = root, int depth = 0) {
С этим именем TrieNode:
struct TrieNode {
bool isLeaf;
vector<TrieNode*> arr;
TrieNode() : isLeaf(false), arr(26, nullptr) {};
};
Редактировать: Отдельное спасибо @SPD за предложение об улучшении функции удаления