我正在尝试实现二进制搜索树,我遇到了这个人的代码,基本上是在尝试复制它:
https://gist.github.com/mycodeschool/44e1a9183ab0e931f729
唯一不同的是,由于某种原因,此人没有将插入或搜索功能作为二进制搜索树类的成员函数。我基本上试图复制他的代码,但我希望这些操作成为课程的一部分(因为我这样做是有道理的......不是应该这样做的吗?)
所以现在这是我的代码:
class BSTnode {
public:
BSTnode(int data) {
BSTnode* right = nullptr;
BSTnode* left = nullptr;
this->data = data;
}
int data;
BSTnode* right;
BSTnode* left;
};
class BinarySearchTree{
public:
BinarySearchTree() {
root = nullptr;
}
BSTnode* insert(BSTnode* root, int data) {
if (root == nullptr) {
BSTnode* newNode = new BSTnode(data);
root = newNode;
return root;
// std::cout << root->data << endl;
}
if (data <= root->data) {
root->left = insert(root->left, data);
}
else {
root->right = insert(root->right, data);
}
return root;
}
public:
BSTnode* root;
};
在我的主要内容中,我有以下内容:
BinarySearchTree bst;
bst.insert(bst.root, 4);
bst.insert(bst.root, 3);
bst.insert(bst.root, 4);
bst.insert(bst.root, 3);
bst.insert(bst.root, 2);
std::cout << bst.root->data << std::endl;
我的第一个问题..我有代码行
std::cout << bst.root->data << std::endl;
在我的主要结束时,只是为了测试事情是否正常工作。但是,当我尝试运行它时,程序崩溃了。当我调试该特定行时,我收到错误:
BST_INTERVIEW.exe中0x00e6160a处的未处理异常:0xC0000005:访问冲突读取位置0xcdcdcdcd。
为什么会这样?其次, 我的代码基本上只是最终使我插入的每个元素成为新的根。当我调试时,它表示每次插入时,条件root == nullptr为true,因此每个新元素基本上都设置为root。我假设当我第一次调用insert时,root并没有指向BST的实际根节点,我认为这是因为我必须设置this-&gt; root = newNode,作为对立面只是根。但我觉得我还必须添加&#34;这个&#34;在代码的其他方面,我只是有点困惑。有人可以帮助我使我的代码像提供的链接中的那个,但BST是一个实际的对象,成员函数插入,搜索等...?
编辑:根据@Semyon Burov的回答,我将插入功能的参数更改为BSTnode *&amp;。我还必须修复我的构造函数,它应该说这个 - >左边和这个 - >右边而不是BSTnode *右边和BSTnode *左边
答案 0 :(得分:2)
问题是,如果要更改函数内部参数的值,则应将其作为引用或指针传递。然后你传递参数作为指针你可以改变而不是指针的值,但它指向它。
BSTnode* insert(BSTnode* root, int data)
您通过值root
传递函数,因此它仅在函数范围内更改。