我的二进制搜索树插入逻辑有什么问题?

时间:2019-03-31 19:58:26

标签: c++

binarysearch.h:


    #ifndef BST_BINARYSEARCH_H
    #define BST_BINARYSEARCH_H

    struct Node{
        int value;
        Node* left;
        Node* right;
    };

    class BST{
    public:
        Node* root;
        BST(){
            root = nullptr;
        }
        Node* insertNode(Node* root, Node toInsert);
        void inOrder(Node* root);
    };

    #endif //BST_BINARYSEARCH_H

binarysearch.cpp:


    #include 
    #include 
    #include "binarysearch.h"

    Node* BST::insertNode(Node* root, Node toInsert) {
        if(root == nullptr){
            root = &toInsert;
        }
        else {
            if (toInsert.value value)
                root->left = insertNode(root->left, toInsert);
            else
                root->right = insertNode(root->right, toInsert);
        }
        return root;
    }

    void BST::inOrder(Node *root) {
        if(root!= NULL){
            inOrder(root->left);
            std::coutvalue;
            inOrder(root->right);
        }
    }

main.cpp:


    #include 
    #include "binarysearch.h"

    int main() {

        BST bst;
        Node* root = nullptr;

        Node a;
        a.value = 4;
        a.left = NULL;
        a.right = NULL;

        root = bst.insertNode(root, a);
        bst.insertNode(root, a);
        a.value = 5;
        bst.insertNode(root, a);
        a.value = 6;
        bst.insertNode(root, a);
        a.value = 7;
        bst.insertNode(root, a);
        a.value = 8;
        bst.insertNode(root, a);

        bst.inOrder(root);
        return 0;
    }

显然,当我插入更多项目时,我的根一直从原来的位置移开。

我正在bst.inOrder(root)上以退出代码139(被信号11:SIGSEGV中断)结束进程。

这是什么问题?

1 个答案:

答案 0 :(得分:0)

问题在于插入节点功能,在这里您说如果树为空,我们将根设置为“ toInsert”的地址。这里的问题是toInsert不是引用,而是通过副本传递的。这意味着toInsert是一个临时的本地副本变量,该变量在函数结束后立即失效。这意味着您的根指针现在没有指向任何东西。

   //NOTE: Passing toInsert, copy is made
   Node* BST::insertNode(Node* root, Node toInsert) {
        //NOTE: root is null, so we set it to point to the node's copy
        if(root == nullptr){
            root = &toInsert;
        }
      //NOTE: The copy is destroyed because we ran out of scope
    }

解决方案是使“ toInsert”成为指针或引用