我的方法是假设从BST返回一个随机节点,但它不能正常工作,我不确定原因。该方法假设在递增计数器的同时使用前序遍历来遍历树。一旦计数器等于随机生成的数字,则假定返回该节点。从树中获取随机节点
// get random node
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;
System.out.println("random number is: " + ranNum);
root = getRandomNode(ranNum, temp);
return root;
}
int count = 0;
public Node getRandomNode(int ranNum, Node temp) {
// traverse through the tree and increment count until count is the
// random number,
// in which case return the node it is on
if (temp != null && count != ranNum) {
count++;
temp = getRandomNode(ranNum, temp.left);
System.out.println(temp.data);
temp = getRandomNode(ranNum, temp.right);
}
// if count is equal to the randomly generated number
return temp;
}
编辑: 使用BFS
public Node getRandomNode(int ranNum, int count, Node temp) {
if(temp == null)
return null;
Queue<Node> q = new LinkedList<Node>();
q.add(temp);
count++;
while(!q.isEmpty() && count != ranNum) {
Node n = q.remove();
System.out.println(" " + n.data);
if(count == ranNum) {
System.out.println("final node: " + n.data);
return n;
}
if(n.left != null) {
q.add(n.left);
count++;
}
if(n.right != null) {
q.add(n.right);
count++;
}
}
return temp;
}
你会如何建议我遍历左,右键的节点?我正在考虑使用'getRandomNode(ranNum,temp.left);“而不是'temp = getRandomNode(ranNum,temp.left);' (与右边相同的东西)遍历树,但后来我不知道如何保存返回指针所在的位置 –
问题是,假设你必须使用预置遍历,你需要一些东西从你的返回值告诉你你已经完成了,可能的修正是使用节点的包装器或者修改节点类(过度使用),在调用之间检查你的全局计数变量(可行,但我不喜欢全局变量),或者在没有达到count变量的情况下返回null(有些人不喜欢返回null来表示事物)我假设这是一个任务,所以我试图不给你一个答案 – billie
好的我会尝试你的建议,并在稍后给你一个更新。而且我不知道自从夏天开始,我只是在开发编码采访中遇到问题,我有时间!这本书有不同的解决方案,但这是我想到的第一个解决方案,所以我想继续。 –