【问题标题】:Can we reduce the time complexity to construct a Binary tree?我们可以降低构建二叉树的时间复杂度吗?
【发布时间】:2016-09-04 23:19:34
【问题描述】:

在我昨天的采访中,我被问到从给定的中序和前序/后序构造二叉树的时间复杂度。

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

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

  1. 将中序遍历的所有节点一一放入哈希表中O(N)。

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

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

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

【问题讨论】:

  • 假设你只是简单地将节点指针链接在一起,那么,肯定是O(N),否则,如果总是遍历根添加一个新节点,那么O(N log N)
  • 你能说的更具体点吗,抱歉我没听懂
  • 假设您将所有节点存储在哈希表中,您如何存储给定节点的父节点等层次结构信息?以及如何在 O(1) 中搜索哈希表中的特定节点?这将需要 O(N) 时间
  • 对于摊销哈希表中的每个元素查找时间都是O(1)
  • 二叉树中的所有元素都是不同的吗?否则会有多种可能。

标签: algorithm tree


【解决方案1】:

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

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

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

【讨论】:

  • 这也是,当不是所有不同的时候,对吧?
  • @stackuser 如果它们不是不同的,那么如何制作哈希表条目?
  • 我们可以使用他们的索引。
  • @stackuser 前序遍历的第一个节点是根节点的值。如果有多个具有该值的节点,您将如何在中序遍历中获得正确的根节点。
  • 好的,谢谢你。现在明白了。你的算法给出了 O(N) 甚至倾斜的树,对吧?
猜你喜欢
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
相关资源
最近更新 更多