Menu
CoddyTech

Range Sum of BST

二分探索木がレベル順に配列 tree に格納されており、2つの数値 low と high が与えられます。ルートはインデックス 0 にあり、インデックス i のノードの子は 2*i+1(左)と 2*i+2(右)にあります。-1 は空の位置を示し、配列の末尾には余分な -1 が含まれる場合があります。二分探索木では、ノードの左部分木にあるすべての値はそのノードの値より小さく、右部分木にあるすべての値は大きくなります。

rangeSumBST という名前の関数を作成し、low ≤ v ≤ high を満たすすべてのノード値 v の合計を返してください。その範囲内に値がない場合は 0 を返します。

関数

rangeSumBST(tree: integer-array, low: integer, high: integer) → integer
treeinteger-array
二分探索木をレベル順で表し、空の位置には -1 を使用します
lowinteger
カウントする最小値
highinteger
カウントする最大値
戻り値integer
lowとhighの間にあるノードの値の合計(lowとhighを含む)

制約

  • 1 ≤ tree.length ≤ 32767
  • 各tree[i]は-1または0 ≤ tree[i] ≤ 105を満たす値です。
  • tree[0] が -1 になることはないため、木には少なくとも1つのノードがあります。
  • 配列は、最後のノードより後に余分な-1の要素が含まれている場合があります。
  • 空の位置の子は両方とも空で、深さは最大でも 14 です。
  • この木は有効な二分探索木なので、すべての値は異なります。
  • 0 ≤ low ≤ high ≤ 105
  • 答えは32ビット符号付き整数に収まります。

例

入力
tree = [20, 8, 31, 3, 12, -1, 40, -1, -1, 10, 15]low = 9high = 31
出力
88
説明
9から31までの値は10、12、15、20、31で、合計は88です。3、8、40は範囲外です。

lock icon提出時に隠しテスト+14件

challenge icon

発展問題

同じ木に対して異なる(low, high)のクエリに何千回も答える必要があるとしたら、それぞれにO(log n)時間で答えるにはどうすればよいでしょうか?

コードをリセット
def rangeSumBST(tree, low, high):
    # ここにコードを書いてください
テストケース

ケース1

ケース2

ケース3

入力

tree = [20, 8, 31, 3, 12, -1, 40, -1, -1, 10, 15]
low = 9
high = 31

期待値

88