二进制搜索树中的第N个最大节点

时间:2018-11-15 05:18:52

标签: java binary-search-tree ranking

我正在尝试在给定数字的Binary Search Tree中找到第N个最大的节点。在线上所有其他解决方案都找到第N个最小的节点,例如:

/**
 * Return the key in the symbol table whose rank is {@code k}.
 * This is the (k+1)st smallest key in the symbol table.
 *
 * @param  k the order statistic
 * @return the key in the symbol table of rank {@code k}
 * @throws IllegalArgumentException unless {@code k} is between 0 and
 *        <em>n</em>–1
 */
public Key select(int k) {
    if (k < 0 || k >= size()) {
        throw new IllegalArgumentException("argument to select() is invalid: " + k);
    }
    Node x = select(root, k);
    return x.key;
}

// Return key of rank k. 
private Node select(Node x, int k) {
    if (x == null) return null; 
    int t = size(x.left); 
    if      (t > k) return select(x.left,  k); 
    else if (t < k) return select(x.right, k-t-1); 
    else            return x; 
} 

来源:https://algs4.cs.princeton.edu/32bst/BST.java.html

如何转换select(Node x,int k)方法以找到第N个最大节点?

例如,在如下所示的BST中:

       30
     /    \
    20    35
   / \    / \
 15   25 31 40

最大节点的密钥为40。

排名BST如下:

        4
     /    \
    6      2
   / \    / \
  7   5  3   1

1 个答案:

答案 0 :(得分:0)

关于此BST需要注意的一件事是,排名从0开始。

更简单的方法

对于包含编号为X0的{​​{1}}个元素的BST,

(X-1)最小元素等于Nth最大元素,反之亦然。

如果您别无选择,只能更改方法

在这种情况下,select的作用类似于对排名进行二进制搜索。因此,如果我们对其进行调整,使其对于较小的排名始终向右(对于较高的排名始终向左),则可以使其返回所需的答案。

反转(X-N)thx.right

x.left