来自BST的随机节点

时间:2016-07-14 00:23:34

标签: java binary-search-tree

我有一个方法,假设在O(n)时间从BST获得一个随机节点。但是,它始终返回根节点。我的方法的逻辑有什么问题?

    public Node getRandomNode(Node root) {

    // get random value between 0 to size of BST
    Random ran = new Random();
    int ranNum = ran.nextInt(size + 1);
    Node temp = root;

    return getRandomNode(ranNum, temp);
}

int count = 0;
public Node getRandomNode(int ranNum, Node temp) {

    if (temp == null)
        return null;

    count++;

    if(count <= ranNum) {
        temp.left =  getRandomNode(ranNum, temp.left);
        if(count == ranNum)
            return temp;
        temp.right =  getRandomNode(ranNum, temp.right);
    }

    return temp;

}

1 个答案:

答案 0 :(得分:0)

如果你看看你在做什么,你会发现无论你做什么,你唯一回归的就是临时。在第一次调用getRandomNode(...)时,你的temp是根节点,你永远不会修改temp。因此,您将始终返回根节点。

要解决此问题,请尝试以下操作:

if(count <= ranNum) {
    temp = getRandomNode(ranNum, temp.left);
    if(count == ranNum)
        return temp;
    temp =  getRandomNode(ranNum, temp.right);
}

return temp;