我使用递归函数将节点插入到我的二叉搜索树中。如果没有,则程序通过创建根节点来工作。 Root是指向节点结构的指针。如果root已经存在,我调用worker函数。
注意: Key为int,Item为字符串。
调用辅助功能时,current->key(-858993460)
和current->item(Error reading characters of string)
不是预期的values (1, "Harrold")
。
递归一直持续到发生此异常:
"Exception thrown: read access violation. current was 0xCCCCCCCC."
Key k
和Item i
是他们的预期价值。这只是我尝试从Node*
root访问它们的原因,我们改变了这一点,我不确定为什么会这样。
感谢任何帮助
void BST::insert(Key k, Item i)
{
if (root == nullptr) {
root = &Node(k, i);
}
else insertRec(k, i, root);
}
void BST::insertRec(Key k, Item i, Node* current)
{
if (current->key == k)//if the key of the inserted node is = to an existing key, change the item.
{
current->item = i;
}
else if (current->key > k)//if the key of the current node is larger than key inserted traverse leftchild recursively calling function
{
if (current->leftChild != nullptr)
insertRec(k, i, current->leftChild);
else
current->leftChild = &Node(k, i);
}
else if (current->key < k)
{
if (current->rightChild != nullptr)
insertRec(k, i, current->rightChild);
else
current->rightChild = &Node(k, i);
}
}
答案 0 :(得分:0)
现在,您在为树创建新节点时所做的是,您要实例化一个临时Node
对象,然后存储该对象的地址。这就是&Node(k, i)
正在做的事情。
问题是临时将超出范围,并且您的BST现在包含指向不存在的内容的Node
指针。这可能是您的程序因无效地址错误而停止的原因。
所以而不是
&Node(k,i)
,
使用
new Node(k, i)
。
这会动态分配一个新的Node
,使指针指向这个Node
“棒”而不是暂时的。
当然,当你需要销毁树时,你负责为BST释放内存。那时您需要浏览树节点并在每个delete
上调用Node
。