2014-02-21 168 views
0

我很困惑指针如何在这里工作。我在这个类中有一个名为PrefixTree的类和一个名为TreeNode的结构。我有下面的代码来构建一个带有字符串的树,问题是每次调用preorder()它都不会正确地返回根字符,然后它会抛出一个分段错误。指针混淆

我想知道我是否正确设置了root指针,或者如果我在其他文件中滥用了它。

//prefixtree.cpp 
PrefixTree::TreeNode* PrefixTree::buildTree(string& input) 
{ 
    char c = input[0]; 
    input.erase(0,1); 

    TreeNode* node = new TreeNode(); 
    node->character = c; 

    if (!root) 
    root = node; 

    if (c == '*') 
    { 
    node->left = buildTree(input); 
    node->right = buildTree(input); 
    } 

    return node; 
} 

void PrefixTree::preorder() 
{ 
    traverse(root); 
} 

void PrefixTree::traverse(TreeNode* node) 
{ 
    if (node) 
    { 
    cout << node->character << endl; 
    traverse(node->left); 
    traverse(node->right); 
    } 
} 

//prefixtree.h 

class PrefixTree 
{ 
    private: 
    struct TreeNode 
    { 
     char character; 
     TreeNode* left; 
     TreeNode* right; 
    }; 

    TreeNode* root; 

    void traverse(TreeNode* node); 

    public: 
    TreeNode* buildTree(string& input); 
    void preorder(); 
}; 

//main.cpp 
PrefixTree tree; 
string a = string("*a**!*dc*rb"); 
cout << tree.buildTree(a)->character << endl; 

tree.preorder(); 
+0

一眼看起来不错。 – John3136

+0

如果您认为预订有bug,请提供代码 – Leeor

+0

我刚刚提供了整个代码 –

回答

1

需要初始化指针成员,他们不会自动初始化,并可能包含垃圾值,而不是nullptr,从而导致你的测试if(!root)if(node)无用,报告未初始化的指针为有效,然后您将取消引用。

添加构造函数:

class PrefixTree 
{ 
private: 
    struct TreeNode 
    { 
     char character; 
     TreeNode* left; 
     TreeNode* right; 

     TreeNode() : character('a'), left(nullptr), right(nullptr) {}; 
    }; 

    TreeNode* root; 

    void traverse(TreeNode* node); 

public: 
    PrefixTree() : root(nullptr) {}; 

    TreeNode* buildTree(string& input); 
    void preorder(); 
}; 
+0

如果我想从'NULL'根开始怎么办? –

+0

@ waldyr.ar你是什么意思? 'nullptr'在这里基本上等价于'NULL'。 – Nabla

+0

我不想在我的根目录中添加一个字符“a”。它应该是一个'NULL'指针,用'buildTree'中的'input'的第一个字符初始化。 –