Trie数据结构的实现

Implementation of Trie data structure

本文关键字:实现 数据结构 Trie      更新时间:2023-10-16

我是编程新手。我正在尝试实现Trie数据结构。但是每当我试图在trie中插入一个字符串时,就会出现分段错误。

这是节点类

class Node{
public:
Node *key[2];
Node *parent;
bool EOW;
Node1(){
this->key[0]=NULL;
this->key[1]=NULL;
this->parent = NULL;
this->EOW = false;
}
};

这是trie类

class Trie{
public:
Node *root;
Trie(){
root =  new Node();
}
void insertUtil(Node *root, char a[]);
void insert(char a[]){
// cout << root <<endl;
// cout << root->key[0];
insertUtil(root, a);
}
};

这就是insertUtil函数

void Trie::insertUtil(Node *root, char a[]){
Node *temp = root;
for(int idx=0;idx<5;idx++){
cout << idx <<endl;
int tmp_chr = a[idx]-'0';
if(!(temp->key[1])){
temp->key[a[idx]-'0'] = new Node();
temp->key[a[idx]-'0']->parent = temp;
}
temp = temp->key[a[idx]-'0'];
}
temp->EOW = -1;
}
int main(){
Trie t1;
char b[5];
cin >> b;
t1.insert(b);
cout << '*';
cin >> b;
t1.insert(b);
cin >> b;
t1.insert(b);
cin >> b;
t1.insert(b);
}

Node的成员key声明为

Node *key[2];

所以它是一个由两个指针组成的数组,给定Trie::insertUtil中的这一行,

int tmp_chr = a[idx]-'0';  // A variable ignored in the following code, BTW.

我假设OP试图插入的"字符串"仅由字符'0''1'组成。

请注意,在发布的代码中,所使用的C字符串中所需的null终止符被简单地忽略,这本身就是一个错误,通过使用适当的std::string很容易修复。

另一个问题也在同一个循环中:

for(int idx = 0; idx < 5; idx++)
{   //           ^^^^^^^                   It should stop before the null-terminator
// (...)
int tmp_chr = a[idx]-'0'; //           Are you sure that there are only '0' or '1'?
if( !(temp->key[1]) )
{ //           ^^^                     1 is wrong, here, it should be temp->key[tmp_chr]
temp->key[a[idx]-'0'] = new Node();
//        ^^^^^^^^^^               Why not use tmp_chr here and in the following?
// ...
}
// ...
}