需要帮助实现二叉搜索树

时间:2015-11-08 08:17:35

标签: c++ binary-search-tree

我正在尝试实现二进制搜索树,我遇到了这个人的代码,基本上是在尝试复制它:

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 *左边

1 个答案:

答案 0 :(得分:2)

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

BSTnode* insert(BSTnode* root, int data)

您通过值root传递函数,因此它仅在函数范围内更改。