Menu
CoddyTech

Kth Smallest Element in a BST

ヒープ順序の配列 root として二分探索木が与えられます。ルートはインデックス 0 にあり、インデックス i の子は 2*i+1(左)と 2*i+2(右)にあり、-1 は空の位置を示します。配列の末尾には余分な -1 が含まれる場合があります。各ノードで、左部分木にはより小さい値のみが含まれ、右部分木にはより大きい値のみが含まれます。

木の中で 1 から数えて k 番目に小さい値を返してください。

関数

kthSmallest(root: integer-array, k: integer) → integer
rootinteger-array
二分探索木をレベル順に並べ、空の位置には -1 を指定
kinteger
昇順で検索する位置(1から数える)
戻り値integer
木の中でk番目に小さい値

制約

  • 1 ≤ root.length ≤ 32767
  • 各 root[i] は -1、または 0 ≤ root[i] ≤ 105 を満たす値です。
  • root[0]は決して-1ではないため、木には少なくとも1つのノードがあります。
  • 配列は、最後のノードの後に余分な -1 のエントリが続く場合があります。
  • 空の場所の子は両方とも空であり、深さは最大でも 14 です。
  • 順序規則はすべてのノードで成り立つため、同じ値が二度現れることはありません。
  • 1 ≤ k ≤木のノード数。

例

入力
root = [41, 17, 65, 6, 29, -1, 90, -1, -1, 22]k = 4
出力
29
説明
値を小さい順に並べると6, 17, 22, 29, 41, 65, 90となり、4番目の値は29です。これはルートの左部分木にある4つの値の中で最大です。
challenge icon

発展問題

木が頻繁に変化し、k 番目に小さい値を何度も求める場合、すべてのクエリが O(h) で済むように、各ノードに何を格納するとよいでしょうか?

コードをリセット
def kthSmallest(root, k):
    # ここにコードを書いてください

テスト #1

テスト #2

引数

root = [41, 17, 65, 6, 29, -1, 90, -1, -1, 22]
k = 4

期待される出力

29