在二叉搜索树中查找K个最大元素

时间:2014-05-08 09:25:39

标签: java recursion binary-tree binary-search-tree

我试图在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;

}

}

我现在已经修好了。这是最终的代码。

这就是我做的事情

  1. 从k>中删除了return语句0块
  2. 将原始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;
    
    }
    

    }

3 个答案:

答案 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个元素应该是更容易的选择。