从BST删除有序的数字序列

时间:2011-09-01 10:28:45

标签: algorithm

我在考试期间遇到了这个问题,但我找不到快速的答案。

有一个数组A包含一些有序数字A = [1,3,6,9,11]和一个数字为键的BST。 我必须提供一个有效的递归算法来从BST中删除A中的数字。

我遇到的问题不是删除节点,而是如何使用删除节点时排序数组的事实。

有人可以帮我提一些提示吗?

2 个答案:

答案 0 :(得分:2)

这是一种可行的方法。

您可以同时遍历BST(使用standard recursive algorithm)和A(从左到右)。每个遍历将按递增顺序产生元素。您正在寻找匹配元素以从树中删除它们。

天真的算法会有O(size(BST))时间复杂度。

在某些情况下,您可以避免完全查看左子树:树中“当前”节点的值为您提供左子树中值的上限,因此如果这小于值的值A的“当前”元素,跳过左子树。

您也可以在用尽A后立即停止算法。

答案 1 :(得分:0)

让BST由其根节点表示。

带参数delete-array-from-bstarray的函数bst为:

  • 如果arraybst为空:返回
  • 将数组拆分为三个子数组,其值小于,等于且大于bst的根节点值
  • 使用左子BST的较小值递归子阵列,然后在右子BST上具有较大值的子阵列上,最后删除相等值(如果适用)

拆分数组是二进制搜索,因此您无需将每个数组值与根节点进行比较。子阵列可以与原始阵列共享结构。删除等值last可确保您不会遇到阵列中每个值的最坏删除情况。