Menu
CoddyTech

Range Sum of BST

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

low ≤ v ≤ high を満たすすべてのノード値 v の合計を返します。該当する値がない場合は 0 を返します。

関数

rangeSumBST(tree: integer-array, low: integer, high: integer) → integer
treeinteger-array
二分探索木をレベル順で表したもので、空の位置には -1 を使用します
lowinteger
数える最小の値
highinteger
数える最大の値
戻り値integer
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は範囲外です。
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