面试官问我这个问题。我尝试使用数组解决它,这样我就可以确保插入时数组排序。但是,我认为这不是最好的解决方案。这个问题的好解决方案是什么?
您可以使用Balenced Binary Search Tree(例如:红黑bst(。
-
只需将节点插入平衡的 bst.,每个节点在其自己的子树中保持其等级。由于我们需要找到最小的元素,我们可以在左子树中维护元素计数。
-
现在,从根开始遍历并检查:
-
如果 k = N +1,其中 N 是根左子树中的节点数。 如果是,则根是第 k 个节点。
-
否则,如果 K <N,则继续在根的左侧子树中搜索。>
- 否则,如果 k> N +1,则继续在右侧子树中搜索。并搜索 (K-N-1( 最小元素。
-
平衡bst中insertion
的时间复杂度为O(logn(。在搜索第 k 个最小元素时,最小元素将是 O(h(,其中 h 是树的高度。
您可以使用订单统计树。从本质上讲,它是一个自平衡的二叉搜索树,其中每个节点还存储其子树的基数。保持基数不会增加任何树操作的复杂性,但允许在 O(logn( 时间内执行查询:
- 如果左侧子树的基数>k,则在左侧子树上递归。
- 否则,如果左侧子树的基数<<em>k,则在右侧子树上递归。
- 否则,左子树的基数等于k,因此返回当前节点的元素。