繁体   English   中英

如何在基于数组的 BST 中找到第 k 个最小元素? (爪哇)

[英]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 spacelinear time做到这一点。

这种遍历称为莫里斯中序遍历

一旦达到所需的计数,您就可以保留一个计数器中断循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM