【问题标题】:Building a suffix tree in C++在 C++ 中构建后缀树
【发布时间】:2025-12-08 23:05:02
【问题描述】:

我正在尝试在 C++ 中构建一个后缀树,作为基因测序任务的一部分

void Tree::insert(string ins)  
{  
  Node* iterator = chooseBranch(root, ins.at(0));  
  string temp;  
  for(int i=0; i<100; i++)  
    {  
      if(iterator->data=="")  
.
.
.

chooseBranch() 是一个函数来选择 4 个孩子中的哪一个,我正在尝试检查这个节点是否已经存在。我的节点类是:

struct Node{  
  Node();  
  string data;  
  Node* A;  
  Node* G;  
  Node* C;  
  Node* T;  
};

这个 if 语句给了我一个段错误,我使用 gdb 回溯到:

#0  0x0000003ce249bbd6 in std::string::compare () from /usr/lib64/libstdc++.so.6
#1  0x000000000040185b in std::operator==<char, std::char_traits<char>, std::allocator<char> > ()
#2  0x0000000000401305 in Tree::insert ()
#3  0x00000000004016d4 in Tree::Tree ()
#4  0x00000000004010a2 in main ()

这种形式的 NULL 检查有什么问题/我还能如何检查节点是否没有数据?

【问题讨论】:

  • 看起来您根本没有检查 NULL - 您只是取消引用指针“迭代器”。也许将您的 if 语句修改为“if(iterator && iterator->data.empty())”。顺便说一句,您的输入字符串“ins”可能为空,在这种情况下,ins.at(0) 将引发异常。
  • 为什么不使用这个code.google.com/p/patl
  • 顺便说一句,你看过 Mark Nelson 在 DDJ 上的著名文章吗? marknelson.us/1996/08/01/suffix-trees

标签: c++ debugging suffix-tree


【解决方案1】:

看起来您根本没有在检查指针 iterator 是否为 NULL,您只是在取消引用它(如果它是 NULL,这将导致戏剧性)。

下面是一个示例,将NULL 的检查从for 循环中提升出来:


void Tree::insert(string ins)
{
    Node* iterator = chooseBranch(root, ins.at(0));
    if (iterator)
    {
        string temp;
        for(int i=0; idata=="")
...

【讨论】: