一尘不染

以最佳方式在二进制搜索树中找到第k个最小元素

algorithm

我需要在二进制搜索树中找到第k个最小的元素,而无需使用任何静态/全局变量。如何有效实现?我想到的解决方案是在O(n)中进行操作,这是最糟糕的情况,因为我计划对整个树进行有序遍历。但在内心深处,我觉得我没有在这里使用BST属性。我的假设解决方案正确还是有更好的解决方案?


阅读 306

收藏
2020-07-28

共1个答案

一尘不染

这只是一个想法的概述:

在BST中,节点的左子树T仅包含小于中存储的值的元素T。如果k小于左侧子树中的元素数,则k第最小元素必须属于左侧子树。否则,如果k较大,则k最小的元素在右子树中。

我们可以扩展BST,使其中的每个节点都在其左侧子树中存储元素数(假设给定节点的左侧子树包括该节点)。有了这些信息,就很容易遍历树,方法是反复询问左子树中的元素数,以决定是否要递归到左子树或右子树中。

现在,假设我们在节点T上:

  1. 如果 k == num_elements(T的左子树) ,那么我们正在寻找的答案是node中的值T
  2. 如果 k > num_elements(T的左子树),则显然我们可以忽略左子树,因为这些元素也将小于k第th 个小元素。因此,我们将问题简化为找到k - num_elements(left subtree of T)正确的子树的最小元素。
  3. 如果 k <num_elements(T的左子树),则第kth k个最小元素在左子树中的某处,因此我们将问题减少到在左子树中找到第th个最小元素。

复杂度分析:

这需要O(depth of node)时间,这O(log n)在平衡的BST上最差,O(log n)对于随机BST则平均。

BST需要O(n)存储,而另一个则需要O(n)存储有关元素数量的信息。所有BST操作都需要O(depth of node)时间,并且需要花费O(depth of node)额外的时间来维护“元素数量”信息以用于节点的插入,删除或旋转。因此,在左子树中存储有关元素数量的信息可保持BST的空间和时间复杂性。

2020-07-28