试图从二叉搜索树中删除一个节点
Trying to delete a node from a binary search tree
当我试图在删除节点后显示我的树时,我得到了内存错误。
这是我的移除(删除)方法:
void binarySearchTree::remove(int x, node * r)
{
bool found = false;
node * previous = NULL;
if (root == NULL)
{cout << "Tree is empty. Nothing to remove." << endl; return;}
while (!found)
{
if (x < r->data)
{
previous = r;
r = r->left;
}
else if (x > r->data)
{
previous = r;
r = r->right;
}
else
found = true;
}
if (r->left == NULL && r->right == NULL) //case 1: node to be deleted is a leaf (no children)
{
delete r;
return;
}
else if(r->left == NULL && r->right != NULL) //case 2: node only has a right child
previous->right = r->right;
else if (r->left != NULL && r->right == NULL) //case 2: node only has a left child
previous->left = r->left;
else
{ //case 3: node has two children
node * minNode = findMinNode(r->right); //finds min node in the right sub tree
r->data = minNode->data;
delete minNode;
return;
}
delete r;
}
My findMinNode方法:
binarySearchTree::node * & binarySearchTree::findMinNode(node * r)
{
if (r == NULL) //if tree is empty
return r;
if (r->left == NULL && r->right == NULL)
return r;
else if (r->left != NULL)
return findMinNode(r->left);
else
return findMinNode(r->right);
}
我的显示方法(使用预购遍历):
void binarySearchTree::display(node * r)
{
if (r == NULL)
return;
display(r->left);
cout << r->data << endl;
display(r->right);
}
我正在使用一个公共display()
方法,然后调用这个私有display(node * r)
方法。
我知道问题是当我使用delete
时,因为当我通过代码并得到我的display()
方法时,当它检查我刚刚删除的节点上的r== NULL
时,地址不是NULL
,地址是0x000000000
,而是0x000000001
。因此,我的程序会崩溃。我以前从未遇到过这个问题。如有任何帮助,我将不胜感激。
我应该补充一下,我插入这些值的顺序是:10、5、34、2、8、12、25、6、18、27、38、11。我试图删除值为12的节点,因为它有两个子节点。
当您删除一个节点时,您需要清空指向它的指针,在您的示例中可以是根、previous->左或previous->右。如果您将previous更改为node **
,并将其指向previous指针(初始化为&root),那么您可以只说*previous = null
或*previous = r->right
。
相关文章:
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限
- 创建了一个链表,但如何删除 c++ 中的"所有"节点
- 在C++的链表末尾插入一个节点
- 节点是否为空,即使它有一个值?
- 在解决链表问题时创建一个额外的节点是一个好习惯吗?
- 插入一个基本的单向链表节点似乎破坏了我的 c++ 代码?
- 在单链表前面添加一个节点后,我无法遍历每个节点
- 删除链接列表中剩余的最后一个节点
- 避免在使用链接列表从 deque 中删除最后一个节点时出现内存泄漏
- 如果我们不创建一个新节点并使用指针插入数据并建立链接(在链表中)怎么办?
- 给一个图 G 找到此图中的所有节点 blob,以便 node.color 属性 = 特定颜色
- 如何在级别上打印树,给定一个结构,该结构保存节点的值及其父节点的值,对于树中的每个节点
- 为什么T是未定义的?我正在尝试实现一个用于双链表的节点类,它不喜欢我使用友元运算符后的T
- C++中是否有一个函数可以为您获取指向该节点的所有指针的地址空间
- C++循环链表删除,计数从下一个节点开始
- 在由邻接列表表示的树中查找节点到另一个给定节点之间的路径
- 如何在 c++ 中实现 avl 树,每个节点都是另一个 avl 树
- 使用异或实现双链表,每个节点一个指针