Menu
CoddyTech

Lowest Common Ancestor of a BST

ふつう二分探索木python iconjava iconcpp iconc iconjs icon+10

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

値 p と q(どちらも木に存在します)の最も低い共通祖先の値を返す lowestCommonAncestor を書いてください。最も低い共通祖先とは、その部分木に両方の値を含む最も深いノードです。ノードは自身の部分木に含まれるため、p が q より上にある場合、答えは p です。

関数

lowestCommonAncestor(tree: integer-array, p: integer, q: integer) → integer
treeinteger-array
二分探索木をレベル順で表し、空の位置には -1 を指定
pinteger
最初に見つける値
qinteger
2番目の値を見つける
戻り値integer
部分木に p と q の両方を含む最も深いノードの値

制約

  • 1 ≤ tree.length ≤ 32767
  • 各tree[i]は-1または0 ≤ tree[i] ≤ 105を満たす値です。
  • tree[0]は決して-1ではないため、木には少なくとも1つのノードがあります。
  • 配列は最後のノードの後に、余分な-1の要素が続く場合があります。
  • 空の場所の両方の子も空であり、深さは最大でも 14 です。
  • この木は有効な二分探索木なので、すべての値は異なります。
  • p と q は、木の中のノードの値です。順序は任意で、同じ値の場合もあります。

例

入力
tree = [20, 8, 31, 3, 12, 25, 40, -1, -1, 10, 15]p = 3q = 15
出力
8
説明
3 と 15 からたどっていくと、両方が最初に到達するノードは 8 です。3 はその左の子で、15 は右側の 12 の下にあります。ルートの 20 も共通の祖先ですが、より上にあります。
challenge icon

発展問題

p または q がツリーに存在しない可能性があり、その場合に関数が -1 を返さなければならないとしたら、何を変更しますか?

コードをリセット
def lowestCommonAncestor(tree, p, q):
    # ここにコードを書いてください

テスト #1

テスト #2

テスト #3

引数

tree = [20, 8, 31, 3, 12, 25, 40, -1, -1, 10, 15]
p = 3
q = 15

期待される出力

8