C ++当节点有两个子节点时从树中删除节点

时间:2012-06-07 03:02:14

标签: c++ tree

假设我有一棵树如下:

          8
     3         12
  4     5    6   15
1  2

如果我想删除3,请将其替换为最左边的节点(在本例中为1)。然后,在该图中,2将附加到4。

我该怎么编码?

我知道你必须通过某种循环继续遍历,然后适当地重置每个指针。此外,您必须考虑最后一个左侧节点可能有一个正确的孩子的情况。

1 个答案:

答案 0 :(得分:0)

在我们解决"如何",2件事之前:

(1) - 这是次要的。这个问题仅在二元搜索树(BST)的上下文中有意义,而不仅仅是二叉树。而且这棵树不是BST,因为交换了3和4。

(2) - 任何时候在BST上执行删除,并且您想要"修复"树生成树也是BST,你有两个选择:(a)你可以选择要删除的节点左子树中的最大值,或者(b)你可以选择右边的最小值要删除的节点的子树,并将其与要删除的节点交换。 (您应该说服自己为什么这些选项都会让您获得BST)。在您的示例中(正确放置3和4),这意味着将4与3或5交换。

现在为"怎么"去做吧。我们说我们从上面选择了选项(a)。您需要做的是编写一个函数,从4开始,将向左移动一步,然后尽可能地向右移动(您还应该说服自己为什么这是正确的)。一旦你无法再向右移动,你就知道你已经找到了左子树中最大的值。然后,将此值替换为要删除的节点,然后删除刚刚使用其值的节点。

如果您已经弄清楚如何对您在此处展示的树进行编码,那么编码实际上非常简单。如果您有特定于代码的问题,请提供更多详细信息