首页 文章

需要帮助实现二叉搜索树

提问于
浏览
-1

我试图实现一个二叉搜索树,我遇到了这个人的代码,基本上是试图复制它:

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 回答

  • 2

    问题是,如果要更改函数内部参数的值,则应将其作为引用或指针传递 . 然后你传递参数作为指针你可以改变而不是指针的值,但它指向它 .

    BSTnode* insert(BSTnode* root, int data)
    

    您将 root 按值传递给函数,因此它仅在函数范围内更改 .

相关问题