使用递归顺序在bst中找到最小的kth

时间:2012-06-17 10:15:30

标签: algorithm binary-search-tree inorder

我想找到BST中最小的第k个。

public void findKthSmallest(BSTNode<T> node, int k) {
    if(node == null) 
        return;
    findKthSmallest(node.left, k);

    count++;
    if (k == count) {
        System.out.println("Kth smallest: " + node.data);
        return;
    }
    findKthSmallest(node.right, k);
}

这里count是一个实例变量。我无法弄清楚如何使用count作为函数中的参数(局部变量)来实现它,因为它在函数返回时会重置。

任何想法??

2 个答案:

答案 0 :(得分:3)

由于这是Java并且您没有通过引用传递,我认为最简单的方法是修改findKthSmallest以返回以node为根的子树中有多少节点。像这样:

public int findKthSmallest(BSTNode<T> node, int k) {
    if(node == null) 
        return 0;
    int left = findKthSmallest(node.left, k);

    if (k == left + 1) {
        System.out.println("Kth smallest: " + node.data);
        return 1;
    }

    return 1 + left + findKthSmallest(node.right, k);
}

答案 1 :(得分:1)

我想在IVlad的方法中做一个小的修正。当我们向左搜索时,问题是找到最小的第k个。但是,当正确搜索时,我们需要找到k-left-1(丢弃左子树+当前节点)。在java中,除了创建类之外,我们不能返回多个值。因此,通过将数组作为参数传递来制作一个hack。这是代码:

public int kthSmallest(TreeNode node, int k, TreeNode kthNode[]) {
    int leftCount = 0;
    int rightCount = 0;
    if(node.left!=null) {
        leftCount = kthSmallest(node.left, k, kthNode);
    }
    if(leftCount==k-1) {
        kthNode[0] = node; // We can also return from here
    }
    if(node.right!=null) {
        rightCount = kthSmallest(node.right, k-leftCount-1, kthNode);
    }
    return leftCount + 1 + rightCount;
}

public TreeNode kthSmallest(TreeNode node, int k) {
    TreeNode kNode[] = new TreeNode[1];
    int nodeCount = kthSmallest(node, k, kNode);
    return kNode[0];
}