在二叉搜索树中打印最大的n值

时间:2014-08-04 06:56:34

标签: java algorithm binary-search-tree

我正在尝试创建一个方法来打印出二叉搜索树中最大的n个值。我正在考虑改变逆序打印方法来实现这一目标。

逆序打印方法:

public static void reverseOrderPrint(TreeNode node) {
    if (node == null) return;
    reverseOrderPrint(node.right);
    System.out.println(node.data);
    reverseOrderPrint(node.right);
}

我想将上述方法修改为类似的内容以实现我的目标

// print BST reverse Order
public static void reverseOrder(TreeNode node, int n) {
    if (sizeOfBinaryTree(node) < n) {
        System.out.print("n is bigger than tree");
        return;
    }
    if (node == null) return;
    reverseOrder(node.right);
    System.out.print(node.data);
    reverseOrder(node.left);
}

我考虑过将相反的顺序元素存储在一个数组中,然后返回前n个值,但这样会产生O(n)的性能并需要额外的内存。如何在不需要额外内存的情况下递归执行相同的任务?也可以在O(log n)中完成这个问题吗?还是必须是O(n)?

2 个答案:

答案 0 :(得分:1)

我认为如果你使用Order Statistics on a Binary Search Tree,你可以得到O(logn)中的第k个最小元素

一旦知道哪个元素位于“第k个”位置,就可以使用普通的Inorder Traversal,并打印大于该数字的所有元素。因此,这将避免额外的O(n)存储。

答案 1 :(得分:0)

将您的方法更新为下方,它将打印最大的n值。您可以在方法外移动n大于树的测试。最初使用i = 0;

进行调用
// print BST reverse Order
public static void reverseOrder(TreeNode node, int n,int i) {
    if (node == null) return;
        reverseOrder(node.right,n,i);
        if(++i<n) System.out.print(node.data);
        reverseOrder(node.left,n,i);
    }
}