我试图实现一个二叉搜索树,我遇到了这个人的代码,基本上是试图复制它:
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-> root = newNode,而不是root . 但我觉得我还必须在代码中的其他位置添加“this”,我只是有点困惑 . 有人可以帮助我使我的代码像提供的链接中的那个,但BST是一个实际的对象,成员函数插入,搜索等...?
编辑:根据@Semyon Burov的回答,我将插入函数的参数更改为BSTnode *& . 我还必须修复我的构造函数,它应该说 - > left和this-> right而不是BSTnode * right和BSTnode * left
1 回答
问题是,如果要更改函数内部参数的值,则应将其作为引用或指针传递 . 然后你传递参数作为指针你可以改变而不是指针的值,但它指向它 .
您将
root
按值传递给函数,因此它仅在函数范围内更改 .