我对指针的工作原理感到困惑。我在这个类中有一个名为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 :(得分: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();
};