【问题标题】:Remove an element from unbalanced binary search tree从不平衡二叉搜索树中删除一个元素
【发布时间】:2014-04-10 03:00:32
【问题描述】:

我一直想为我的二叉搜索树(恰好是一个数组表示)编写remove() 方法。但在写之前,我必须考虑所有情况。省略所有情况(因为它们很容易),除非节点有两个孩子,在我到目前为止阅读的所有解释中,我看到的大多数情况都从已经平衡的二叉搜索树中删除了一个元素。在我看到从不平衡二叉搜索树中删除元素的少数情况下,我发现他们通过 zigs 和 zags 平衡它,然后删除元素。

有没有一种方法可以从不平衡的二叉搜索树中删除一个元素,而无需事先平衡它?

如果没有,写 AVL 树会更容易(以数组表示)吗?

【问题讨论】:

  • 您是否在每个树节点中使用数组索引偏移量,或者您是否记得您所在的树级别并使用乘法来查找索引?如果是第二个,我相信你的树必须是平衡的。
  • 数组包含节点,节点包含数据及其子节点的索引。 -1 如果没有孩子在场。
  • 无论如何我都错了需要平衡。具有固定位置数组节点的不平衡树只会浪费空间但仍然有效。

标签: c++ algorithm binary-search-tree


【解决方案1】:

您不需要对其进行平衡,但您确实需要递归地向下执行一些交换,以便您最终得到一个有效的 BST。

在(不平衡的)BST 中删除具有 2 个子节点的节点:(来自 Wikipedia

调用要删除的节点N。不要删除N。而是选择它的有序后继节点或它的有序前驱节点R。将R的值复制到N,然后递归调用R上的delete直到达到前两种情况之一。

从二叉搜索树中删除具有两个子节点的节点。首先,识别左子树中最右边的节点,即顺序前驱 6。它的值被复制到被删除的节点中。然后可以轻松删除 inorder 前驱,因为它最多有一个孩子。相同的方法使用标记为 9 的中序后继对称地工作。

虽然,你为什么想要一棵不平衡的树?它的所有操作都需要更长的时间(或至少一样长),并且平衡的额外开销不会改变任何操作的渐近复杂性。而且,如果您使用索引i 处的节点在索引2i2i+1 处有子节点的数组表示,它可能最终会变得相当稀疏,即会浪费相当多的内存。

【讨论】:

  • 嗯,这是一项任务,虽然我很想把它做得完美,但时间很短,所以我不会真正让它成为一个自平衡的 BST,除非需要,我不是.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 2013-12-18
相关资源
最近更新 更多