簡體   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