我在考试期间遇到了这个问题,但我找不到快速的答案。
有一个数组A包含一些有序数字A = [1,3,6,9,11]和一个数字为键的BST。 我必须提供一个有效的递归算法来从BST中删除A中的数字。
我遇到的问题不是删除节点,而是如何使用删除节点时排序数组的事实。
有人可以帮我提一些提示吗?
答案 0 :(得分:2)
这是一种可行的方法。
您可以同时遍历BST(使用standard recursive algorithm)和A
(从左到右)。每个遍历将按递增顺序产生元素。您正在寻找匹配元素以从树中删除它们。
天真的算法会有O(size(BST))
时间复杂度。
在某些情况下,您可以避免完全查看左子树:树中“当前”节点的值为您提供左子树中值的上限,因此如果这小于值的值A
的“当前”元素,跳过左子树。
您也可以在用尽A
后立即停止算法。
答案 1 :(得分:0)
让BST由其根节点表示。
带参数delete-array-from-bst
和array
的函数bst
为:
array
或bst
为空:返回bst
的根节点值拆分数组是二进制搜索,因此您无需将每个数组值与根节点进行比较。子阵列可以与原始阵列共享结构。删除等值last可确保您不会遇到阵列中每个值的最坏删除情况。