我试图在BST中找到K个最大的元素,但我的代码流没有正确发生。例如,考虑下面的BST
9
/ \
7 12
/ \ / \
6 10 11 16
我的代码流程按顺序16发生 - > 12 - > 9,虽然我试图让它16 - > 12 - > 11。
代码如下
public class FindKLargestElements {
private static int n =0;
public static int[] findLarge(Node node, int large[], int k) {
if (node == null) return large;
if (k == 0) return large;
findLarge(node.getRightNode(), large, k);
if (k >0) {
large[n] = node.getValue();
k = k -1;
n = n +1;
return large;
}
findLarge(node.getLeftNode(), large, k);
return large;
}
}
我现在已经修好了。这是最终的代码。
这就是我做的事情
将原始k更改为类级别而不是递归方法级别,因为更新它会丢失。
public class FindKLargestElements {
private static int n =0;
private static int k =3;
public static int[] findLarge(Node node, int large[]) {
if (node == null) return large;
if (k == 0) return large;
findLarge(node.getRightNode(), large);
if (k >0) {
large[n] = node.getValue();
k = k -1;
n = n +1;
}
findLarge(node.getLeftNode(), large);
return large;
}
}
答案 0 :(得分:1)
请尝试以下程序
public class FindKLargestElements {
private static int n =0;
private static int large[];
public static void findLarge(Node node, int k) {
if (node == null) return;
if (k == 0) return;
findLarge(node.getRightNode(), k);
if (k >0) {
large[n] = node.getValue();
k = k-1;
n = n+1;
}
findLarge(node.getLeftNode(), k);
}
}
答案 1 :(得分:0)
我建议使用一种非常不同但更简单有效的方法来获取二叉搜索树的k最大元素。
<强> 1。使用inorder遍历来获取列表或数组中的已排序元素
function inorder(node) {
if (node == null)
return;
inorder(node.left);
visit(node);
inorder(node.right);
}
<强> 2。从最后一个元素开始访问最后的K个元素。
use for loop or while
答案 2 :(得分:0)
另一种方法是创建给定BST的镜像并对前K个元素进行inorder遍历。这些将是最大的元素。这种方法的缺点是你浪费时间来创建镜像树,但后来获得的优势是你不必在以后遍历整个n个元素。
由于k可能与n一样大,在最坏的情况下,我们仍然必须遍历BST中的每个元素。因此,简单地执行原始BST的inorder遍历并返回inorder遍历中的最后k个元素应该是更容易的选择。