在我昨天的采访中,我被要求时间复杂度来构建一个二元树,从给定的顺序和预订/后序。
我提出了需要O(N ^ 2)的偏斜树,如果我们能保证平衡的二叉树,那么我们可以在O(N log N)中进行。
但是,为了回复唯一,我想出了一个可以在O(N)时间内完成的想法。我给的理由是
逐个遍历O(N)中哈希表中遍历遍历的所有节点。
在哈希表中搜索特定节点可以在摊销的O(1)中完成。
理论上,总时间复杂度可以降低到O(N)。 (实际上,我还没有实现它)
那么,我的答复是否正确,结果尚未公布。
答案 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
注意:以上是基本想法。对于递归调用,您需要更仔细地获取正确的索引。