我正在尝试创建一个方法来打印出二叉搜索树中最大的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)?
答案 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);
}
}