是否有可能从未排序的数组中有效地创建平衡的二叉搜索树而无需对数组进行排序?

时间:2014-03-13 17:50:13

标签: java c++ arrays algorithm tree

标题说明了一切。

我看到我可以很容易地从未排序的数组中创建二叉搜索树。

If root is null, set 1st array value to the root
current = root
for each value in the array:
  while current not null
     If arrays value >= current value
          if root.left is null, set array value to current.right
          else current = current.right and continue
     Else if arrays value < current value
          if current.left is null, set array value to current.left
          else current = current.left
return root;

并且还可以轻松地从有序数组中创建平衡二进制搜索树。

Get the Middle of the array and make it root.
Recursively do same for left half and right half.
      Get the middle of left half and make it left child of the root created in step 1.
      Get the middle of right half and make it right child of the root created in step 1.

但是有没有一种有效的方法可以轻松地从未排序的数组创建平衡的二进制搜索树,而无需更改数组/复制数组等。

1 个答案:

答案 0 :(得分:5)

如果您手头没有库,那么您的第二种方法可能是最简单的方法。如果你使用一个好的排序算法(渐近最优和非常低的常数因子),它也非常有效。

您的第一种方法效率不高,因为树可能变得不平衡。 但是,您可以按任意顺序将所有元素逐个插入self-balancing binary search tree。这也需要时间 O(n log n),就像第二种方法一样。

当然你不能比这更快地做到这一点,因为那时你只需要使用比较{{3来对 o(n log n)中的数组进行排序。 }}