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中断)结束进程。
这是什么问题?
答案 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”成为指针或引用