我需要在二进制搜索树中找到第k个最小的元素,而无需使用任何静态/全局变量。如何有效实现?我想到的解决方案是在O(n)中进行操作,这是最糟糕的情况,因为我计划对整个树进行有序遍历。但在内心深处,我觉得我没有在这里使用BST属性。我的假设解决方案正确还是有更好的解决方案?
这只是一个想法的概述:
在BST中,节点的左子树T仅包含小于中存储的值的元素T。如果k小于左侧子树中的元素数,则k第最小元素必须属于左侧子树。否则,如果k较大,则k最小的元素在右子树中。
T
k
我们可以扩展BST,使其中的每个节点都在其左侧子树中存储元素数(假设给定节点的左侧子树包括该节点)。有了这些信息,就很容易遍历树,方法是反复询问左子树中的元素数,以决定是否要递归到左子树或右子树中。
现在,假设我们在节点T上:
k - num_elements(left subtree of T)
复杂度分析:
这需要O(depth of node)时间,这O(log n)在平衡的BST上最差,O(log n)对于随机BST则平均。
O(depth of node)
O(log n)
BST需要O(n)存储,而另一个则需要O(n)存储有关元素数量的信息。所有BST操作都需要O(depth of node)时间,并且需要花费O(depth of node)额外的时间来维护“元素数量”信息以用于节点的插入,删除或旋转。因此,在左子树中存储有关元素数量的信息可保持BST的空间和时间复杂性。
O(n)