【问题标题】:Find the median of binary search tree, C++找到二叉搜索树的中位数,C++
【发布时间】:2015-05-11 20:34:02
【问题描述】:

有一次我被“一家知名公司”面试,面试官让我求 BST 的中位数。

int median(treeNode* root)
{

}

我开始实施我想出的第一个蛮力解决方案。我使用中序遍历将所有数据填充到std::vector<int> 中(以使所有内容都在向量中排序)并获得中间元素。 所以我的算法是 O(N) 用于插入向量中的每个元素并使用 O(1)、+ O(N) 的内存查询中间元素。 那么有没有更有效的方法(就内存或复杂性而言)来做同样的事情。
提前致谢。

【问题讨论】:

  • 如果您可以将树修改为等级树(每个节点还保存其作为根的子树中的节点数),则可以在 O(logn) 时间和空间内完成,不改变树的插入/删除/搜索。

标签: c++ algorithm vector time-complexity binary-search-tree


【解决方案1】:

二叉树为您的数据提供了一个排序视图,但为了利用它,您需要知道每个子树中有多少元素。因此,如果没有这些知识,您的算法就足够快了。

如果你知道每个子树的大小,你就选择每次访问左子树或右子树,如果二叉树是平衡的,这就给出了O(log n)算法。

【讨论】:

    【解决方案2】:

    由于您知道中位数是已排序元素列表的中间元素,因此您可以只取中序遍历的中间元素并停在那里,而无需将值存储在向量中。如果您不知道节点的数量,您可能需要两次遍历,但这会使解决方案使用更少的内存(O(h) 其中h 是您的树的高度;h = O(log n) 用于平衡搜索树)。

    如果你可以扩充树,你可以使用我给here 的解决方案来获得O(log n) 算法。

    【讨论】:

      【解决方案3】:

      可以在O(n)时间和O(logN)空间内完成,方法是按顺序遍历并在到达n/2th节点时停止,只需携带一个计数器,告诉您已经遍历了多少节点- 无需实际填充任何向量。

      如果您可以将树修改为排名树(每个节点还具有有关其作为根的子树中的节点数量的信息) - 您可以在 O(logN) 时间内轻松解决它,只需向n/2 个元素的方向。

      【讨论】:

      • 不能用O(1) 额外的内存来做排名树吗?我们只关心该解决方案中的当前节点。
      • @IVlad 认为你是对的,我是在递归地思考,但是只保持最新的迭代没有问题。
      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2011-01-31
      • 1970-01-01
      相关资源
      最近更新 更多