[英]How to find kth smallest element in an array based BST? (Java)
我被赋予了这个任务,但这对我来说似乎非常困难。
public class BinarySearchTree<A extends Comparable<? super A>> {
public int[] size
public Object[] list
public A get(int x) {
}
}
7
/ \
5 10
/ \ / \
3 6 9 11
The above tree would be stored as [7, 5, 10, 3, 6, 9, 11] in the list array.
所以我有这个结构。 我必须使用子树的大小找到第 x 个最小的元素。 我对如何首先找到子树的大小然后使用该信息来找到第 x 个值一无所知。
有没有人有办法? 我已经尝试了很多天,但即使是网络也没有给我太多信息。
任何帮助表示赞赏,谢谢。
请记住,BST 是经过排序的。 底层数组不是,但是如果您以某种方式遍历树(留给您找出),您将按升序获取每个元素。 如果您确实设法找出如何执行此操作,则只需查看直到到达第 n 个元素。
我想您可以使用子树的大小来计算它,但这听起来不必要地复杂(也就是说,代码可读性较差,数学不太难)并且在现实生活中不切实际。 毕竟,BST 的存在是有原因的。
可以用尺寸来做。 想象一下,你从根开始。 令 L 为左子树的大小,R 为右子树的大小。 你的节点总数将是 L + R + 1。你的根将有索引 L,如果 x 大于 L,你知道你会在右子树中找到你的元素,如果它更小,那么看看你的左边。 (假设 x 是空索引的)。 这是一般模式,您可能可以自己弄清楚其余部分。
编写一个递归方法 size(tree) 来计算树节点的大小。
size(tree) {
if tree == null
return 0;
return 1 + size(tree.left) + size(tree.right)
}
给定一棵树,找到第 k 个元素(从 k=1 开始),如下所示:
find(tree, k) {
let left_size = size(tree.left)
let current_index = left_size + 1
if k == current_index
return tree
if k > current_index
return find(tree.right, k - current_index)
else
return find(tree.left, k)
}
总结:如果你的左边有k-1个物品,那么你当前的位置是物品k。
如果您当前的位置小于 k,则搜索右树,但将您的搜索索引减少当前节点的索引 (left_size + 1),其中包括当前节点处的项和左树中的所有项。
如果您当前的位置大于 k,则在左树中搜索项 k。
我们可以在constant space
和linear time
做到这一点。
这种遍历称为莫里斯中序遍历
一旦达到所需的计数,您就可以保留一个计数器并中断循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.