C++ 当节点有两个子节点时,从树中删除该节点
C++ Deleting a node from a tree when the node has two children
假设我有一棵树,如下所示:
8
3 12
4 5 6 15
1 2
如果我想删除 3,请将其替换为左下角的节点(在本例中为 1)。 然后,在该图中,2 将附加到 4。
我将如何编码?
我知道你必须一直遍历到某种循环,然后适当地重置每个指针。此外,您必须考虑最后一个左节点可能有右子节点的情况。
在我们解决"如何"之前,有两件事:
(1) - 这是次要的。 这个问题仅在二叉搜索树(BST)的上下文中有意义,而不仅仅是二叉树。 这棵树不是 BST,因为 3 和 4 是交换的。
(2) - 任何时候您对 BST 执行删除,并且想要"修复"树以使生成的树也是 BST,您有两种选择:(a) 您可以选择要删除的节点的左侧子树中的最大值,或者 (b) 您可以选择要删除的节点的右侧子树中的最小值, 并将其与要删除的节点交换。 (你应该说服自己为什么这些选项都会给你留下BST)。 在您的示例中(正确放置了 3 和 4),这意味着将 4 与 3 或 5 交换。
现在是"如何"做到这一点。 假设我们从上面选择了选项 (a)。 你需要做的是编写一个函数,从 4 开始,向左走一步,然后尽可能长时间地向右遍历(你也应该说服自己为什么这是正确的)。 一旦您无法再向右遍历,您就知道您已在左侧子树中找到了最大值。 然后,交换此值来代替要删除的节点,然后删除刚刚获取其值的节点。
如果您已经弄清楚如何对此处介绍的树进行编码,那么这实际上非常简单。 如果您有特定于代码的问题,请提供更多详细信息
相关文章:
- 为什么我的删除节点函数实际上没有删除节点?
- 我们可以删除链表中静态内存中的节点吗
- 为什么"delete"关键字不删除节点?
- 为什么我的双向链表删除函数会删除多个节点?
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限
- 删除 XML 文件中的子节点C++
- 创建了一个链表,但如何删除 c++ 中的"所有"节点
- 从unordered_map中删除单个节点
- 删除链表中的特定节点
- 在C++中删除双向链表的头节点后出现访问冲突异常
- 删除链表中的节点 - 分段错误
- 删除链接列表中剩余的最后一个节点
- 避免在使用链接列表从 deque 中删除最后一个节点时出现内存泄漏
- 使用函数引用指向节点的指针删除链表中的节点?
- 双向链表 - 无法删除第一个节点
- 双向链表 std::unique_ptr 类在节点删除时无法按预期工作
- BST 节点删除 - 指针未正确删除
- 节点删除功能的链表问题
- 布尔函数始终为真,单向链表中的尾节点删除创建无限循环
- AVL树中节点删除值异常