我有一个方法,假设在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;
}
答案 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;