我们可以减少构建二叉树的时间复杂度吗?

时间:2016-09-04 14:58:46

标签: algorithm tree

在我昨天的采访中,我被要求时间复杂度来构建一个二元树,从给定的顺序和预订/后序。

我提出了需要O(N ^ 2)的偏斜树,如果我们能保证平衡的二叉树,那么我们可以在O(N log N)中进行。

但是,为了回复唯一,我想出了一个可以在O(N)时间内完成的想法。我给的理由是

  1. 逐个遍历O(N)中哈希表中遍历遍历的所有节点。

  2. 在哈希表中搜索特定节点可以在摊销的O(1)中完成。

  3. 理论上,总时间复杂度可以降低到O(N)。 (实际上,我还没有实现它)

  4. 那么,我的答复是否正确,结果尚未公布。

1 个答案:

答案 0 :(得分:1)

可以在O(N)时间和O(N)空间(对于倾斜的二叉树)完成,但不是存储inorder遍历的元素,而是将元素的索引存储在哈希表中。然后,以下算法应该起作用:

Function buildTree (in_index1, in_index2, pre_index1, pre_index2)
   root_index = hashEntry [pre-list[pre_index1]]
   createNode (root)
   root->leftChild = buildTree (in_index1, root_index-1, pre_index1 + 1, pre_index1 + (root_index-in_index1))
   root->rightChild = buildTree (root_index+1, in_index2, pre_index1 + (root_index-in_index1) + 1, pre_index2)
   return root

注意:以上是基本想法。对于递归调用,您需要更仔细地获取正确的索引。