struct Node{
Node* ch[26];
string str;
Node(){
for(int i = 0; i < 26; i++) {
ch[i] = NULL;
}
str = "";
}
};
class Solution {
public:
vector<string> results;
Node* root;
void insert(Node* p, string s) {
int len = s.size();
for(int i = 0; i < len; i ++) {
if(p->ch[s[i] - 'a'] == NULL) {
p->ch[s[i] - 'a'] = new Node();
}
p = p->ch[s[i] - 'a'];
}
p->str = s;
}
vector<string> wordSearchII(vector<vector<char> > &board, vector<string> &words) {}
}
这是我为我的问题定义的Trie。 &#34; root&#34;和&#34;矢量结果&#34;都是Solution的成员变量。我想问的问题是为什么我必须&#34;新的Node()&#34;在我使用root之前。我不需要&#34;新的矢量&#34;在我使用结果之前。我知道解决方案将调用默认构造函数然后&#34;结果&#34;将调用其默认构造函数。为什么不能使用Node的默认构造函数?
我碰巧意识到我的混淆可能与指针&#34;有关。但我仍然不了解细节。任何人都可以解释一下吗?我真的很感激。
答案 0 :(得分:0)
在
Node* root;
*
表示root
是指向 Node
对象的指针,它不是实际 {{1对象本身。指针所拥有的唯一存储足以保存指针所指向的内存地址。指针必须指向某个东西。现在,你不知道Node
指向的是什么,这是......糟糕的。你不知道如果你试着读它会得到什么,如果你试着写它,你不知道你会粉碎什么。您需要指定root
指向的内容,如果这是root
,那么它也可以,但它也可以是预先存在的new Node()
或{{1}在自动存储中(在堆栈的某处)。
另一方面,在
Node
Node
不是指向vector<string> results;
对象的指针。它是实际的results
对象。它是存储。没有必要为它分配内存,只需在堆栈上声明它为它分配所有内容并调用它的默认构造函数。
答案 1 :(得分:0)
root
只是一个指针,但你没有指定任何东西指向它。您需要分配一个新的Node
对象,然后将该对象的地址分配给root
,例如:
class Solution {
public:
vector<string> results;
Node* root;
Solution() {
root = new Node;
}
~Solution() {
delete root;
}
...
};
否则,不要让root
成为指针:
class Solution {
public:
vector<string> results;
Node root;
...
};
另外,您的Node
类需要析构函数来销毁添加到其中的所有子节点:
struct Node{
Node* ch[26];
string str;
Node(){
for(int i = 0; i < 26; i++) {
ch[i] = NULL;
}
}
~Node(){
for(int i = 0; i < 26; i++) {
delete ch[i];
}
}
};