从二叉搜索树中删除一个节点
C++ Delete a node from binary search tree
这是我试图解决这个特殊问题的地方:http://mycodeschool.com/work-outs/binary-search-trees/7
如果要删除的节点有两个子节点,则采用的策略是将该节点替换为其左子树中的最大值(我们称之为MAX_LEFT)。然后,您可以简单地删除节点MAX_LEFT。这个策略在我们的视频中也讨论过。
我正试图通过下面的代码解决这个问题。但有一些问题,我没有得到预期的输出。
struct Node
{
int data;
struct Node* left;
struct Node* right;
}
Node* FindMax(Node* root)
{
if(root==NULL)
return NULL;
while(root->right != NULL)
{
root = root->right;
}
return root;
}
Node* DeleteNodeInBST(Node* root,int data)
{
if(root==NULL) return root;
else if(data<=root->data)
root->left = DeleteNodeInBST(root->left, data);
else if (data> root->data)
root->right = DeleteNodeInBST(root->right, data);
else
{
//No child
if(root->right == NULL && root->left == NULL)
{
delete root;
root = NULL;
}
//One child
else if(root->right == NULL)
{
Node* temp = root;
root= root->left;
delete temp;
}
else if(root->left == NULL)
{
Node* temp = root;
root= root->right;
delete temp;
}
//two child
else
{
Node* temp = FindMax(root->left);
root->data = temp->data;
root->left = DeleteNodeInBST(root->left, temp->data);
}
}
return root;
}
这部分
if(data<=root->data)
root->left = DeleteNodeInBST(root->left, data);
else
...
当data
等于当前节点root
时,也将向下步进到左子树。因此,您将永远不会到达第三个else
。尝试用<
代替<=
在下面的代码段中,在2 else if语句之后,final else语句永远不会执行,因为没有其他的可能性:
else if(data<=root->data)
root->left = DeleteNodeInBST(root->left, data);
else if (data> root->data)
root->right = DeleteNodeInBST(root->right, data);
else
....
明白了。我必须删除"="在"else if(data<=root->data)",然后它的工作
相关文章:
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 在C++的链表末尾插入一个节点
- 在单链表前面添加一个节点后,我无法遍历每个节点
- 删除链接列表中剩余的最后一个节点
- 避免在使用链接列表从 deque 中删除最后一个节点时出现内存泄漏
- C++循环链表删除,计数从下一个节点开始
- 如何删除上一个节点?
- 添加一个节点,并在通用树中的两个给定节点之间找到路径成本,其中c 中的儿童列表
- 我试图键入一个函数来在单链表的末尾添加一个节点,但不起作用
- 尝试指向链表中的上一个节点
- 取消下一个节点的空链接列表的头
- 删除最后一个节点,并将尾部更新到最后一个节点
- 计算列表中与线性链接列表中最后一个节点具有相同数据的节点的数量
- 从C++二进制搜索树中删除一个节点(类而非结构)
- 为什么我的原始二叉搜索树被修改,即使我在另一个节点中复制了根节点
- 如何在QT中获取XML文件的最后一个节点
- 交换C 中的第一个和最后一个节点
- 删除链表的每隔一个节点
- 尾部指向最后一个节点
- 使用循环在链接列表的前面插入一个节点