二叉搜索树 - 访问冲突
Binary Search Tree - Access Violation
此方法查找 BST 中最大的节点返回其值并将其删除。我在 prev->rightLink = cur->leftLink;
收到访问违规。 我对C++相对陌生,找不到原因。
int CTree::popLargest(TreeNode* tr)
{
int largest;
TreeNode* prev = NULL;
TreeNode* cur = tr;
while (cur->rightLink != NULL)
{
prev = cur;
cur = cur->rightLink;
largest = cur->info;
//DeleteAttemptTwo(tr, largest);//DeleteItem(largest);
}
if (cur->leftLink != NULL)
{
prev->rightLink = cur->leftLink;
}
else
{
prev->rightLink = NULL;
}
return largest;
}
如果,否则没有什么意义 -
if (cur->leftLink != NULL)
{
prev->rightLink = cur->leftLink;
}
else
{
prev->rightLink = NULL;
}
您正在尝试做的事情可以通过以下方式完成 - prev->rightLink = cur->leftLink;
您在此语句上收到访问冲突的原因是prev
没有指向有效节点,即它被NULL
(初始化时)。
如果树没有任何正确的子级,prev 将保持空值并在执行时保持
nullprev->rightLink = cur->leftLink;
您正在尝试访问空变量的属性,因此"访问Voilation"。
原因是 prev 仍然是 NULL。取消引用指针时,应验证指针是否为 NULL。顺便说一句,这个问题很容易通过调试找到。
const int INVALID_VALUE = -1; // change it by yourself.
int CTree::popLargest(TreeNode* tr)
{
int largest = INVALID_VALUE;
if (tr != NULL)
{
TreeNode* prev = NULL;
TreeNode* cur = tr;
while (cur->rightLink != NULL)
{
prev = cur;
cur = cur->rightLink;
largest = cur->info;
//DeleteAttemptTwo(tr, largest);//DeleteItem(largest);
}
if (prev != NULL)
{
if (cur->leftLink != NULL)
{
prev->rightLink = cur->leftLink;
}
else
{
prev->rightLink = NULL;
}
}
}
return largest;
}
你没有考虑到tr
没有正确的元素(tr->rightLink = NULL
,cur = tr
)的情况,因此while
循环的内容永远不会执行。在这种情况下,prev
保持为 NULL
,这意味着您在尝试访问 prev
的 rightLink
元素时尝试取消引用NULL
。
尝试取消引用NULL
将导致某种访问冲突错误。
相关文章:
- 有根的二进制搜索树.保留与其父级的链接
- 写入位置0x0000000C时发生访问冲突
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 正在尝试重载二进制搜索树分配运算符
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- 使用C++创建特殊的二叉搜索树
- C++尝试深度复制唯一指针时出现内存访问冲突
- 在递归二叉搜索树中搜索
- 使用二进制搜索树中的迭代器对象访问左侧节点
- 访问冲突二叉搜索树模板
- 二叉搜索树 - 访问冲突
- 0xC0000005中0x770115de处未处理的异常:使用递归矢量搜索读取位置0xccccccc0时发生访问冲突
- 提升属性树访问冲突
- 删除二叉搜索树中的节点中的 Visual Studio 中的访问冲突异常
- 添加节点时C++二叉搜索树状态访问冲突错误
- 访问二叉搜索树中的违规读取位置0x00000000
- 递归函数插入二叉搜索树无法按根访问节点
- 内存访问冲突插入结构在树结构c++
- 在函数中访问二叉搜索树