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

Java 如何在基于阵列的BST中找到第k个最小元素?(爪哇),java,arrays,algorithm,binary-search-tree,Java,Arrays,Algorithm,Binary Search Tree,我被赋予这项任务,但这对我来说似乎非常困难 public class BinarySearchTree<A extends Comparable<? super A>> { public int[] size public Object[] list public A get(int x) { } } 所以我有这个结构。 我必须通过使用子树的大小来找到第x个最小的元素。 我不知道如何首先找到子树的大小,然后使用这些信息来找到第x个值 有人有办法吗?我已经尝试了好几

我被赋予这项任务,但这对我来说似乎非常困难

public class BinarySearchTree<A extends Comparable<? super A>> {

public int[] size
public Object[] list

public A get(int x) {
}

}
所以我有这个结构。 我必须通过使用子树的大小来找到第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。

我们可以在
常量空间和
线性时间中执行此操作

这是一个叫做莫里斯的顺序遍历


只要满足所需的计数,就可以保留计数器,并中断循环。

这是BST吗?你得到的结构是一个通用的树眼,它是一个BST。我将更改代码使其更加明显。请注意,StackOverflow不是人们为你完成家庭作业的地方。不,它不是。我不是要求别人给我复制粘贴代码。我正在向一群有知识的人寻求帮助,帮助他们解决这样一棵独特的树的问题。但是感谢您的贡献。是否保证没有包含单个子节点的节点?谢谢,这是一个非常有用的答案。我知道按升序打印节点需要按顺序遍历,从那开始很容易,但这项任务特别要求我将每个子树的大小存储到一个数组中,然后使用每个子树的大小获得第k个元素,我知道这是不可行的。我用一个新的提示更新了它。请记住,左子树包含第一个
SIZE(左)
#节点,右子树包含最后一个
SIZE(右)
#。您应该能够对所有子树应用此方法的一般思想,但记住每次都要考虑根的索引。每当您继续处理一个新子树时,您只处理该特定子树的第一个和最后一个元素。
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)

}