在O(n)时间内将堆转换为BST?

时间:2012-12-31 23:37:46

标签: algorithm data-structures big-o binary-search-tree binary-heap

我认为我知道答案,最低复杂度是 O(nlogn)

但是,有没有办法可以在 O(n)复杂度中从堆中创建二进制搜索树?

1 个答案:

答案 0 :(得分:20)

在O(n)时间内没有用于从堆构建BST的算法。原因是给定n个元素,你可以在O(n)时间内从它们构建一个堆。如果您有一组值的BST,则可以通过执行inorder遍历在O(n)时间内对它们进行排序。如果你可以在O(n)时间从堆构建BST,那么你可以通过

获得O(n)排序算法
  1. 在O(n)时间内构建堆,
  2. 在O(n)时间内将堆转换为BST,
  3. 在O(n)时间内走BST以获得排序顺序。
  4. 因此,无法在O(n)时间(或o(n log n)时间内将堆转换为BST,其中o为 little-o notation )。

    但是,可以通过重复从BST中取出最大值并将其作为树中最右边的节点插入,在O(n log n)时间内从堆构建BST。 (你需要在那里存储一个指针以便快速访问;只需在根处重复插入就需要O(n 2 )时间。)

    希望这有帮助!