Menu
CoddyTech

Construct Binary Tree from Preorder and Inorder Traversal

同じ二分木の異なる値を列挙した2つの配列 preorder と inorder が与えられます。先行順走査では、ノードを訪問し、次に左部分木、右部分木の順に訪問します。中間順走査では、左部分木、ノード、右部分木の順に訪問します。

木を再構築し、レベル順の配列として返してください。ルートはインデックス 0 に置き、インデックス i の子は 2i+1(左)と 2i+2(右)に置き、空の位置にはそれぞれ -1 を入れます。配列は最後のノードで終わり、末尾に -1 は付きません。

関数

buildTree(preorder: integer-array, inorder: integer-array) → integer-array
preorderinteger-array
先行順の値:ノード、左部分木、右部分木
inorderinteger-array
中順での値: 左部分木、ノード、右部分木
戻り値integer-array
レベル順の木。空の位置には -1 を使い、末尾に -1 は付けない

制約

  • 1 ≤ preorder.length ≤ 3000
  • inorder.length == preorder.length
  • 0 ≤ preorder[i] ≤ 104で、すべての値は異なります。
  • inorderには同じ値が格納されており、どちらの配列も同じ二分木を表しています。
  • 木の深さは最大でも14なので、答えに含まれるすべてのインデックスは214-1 = 16383未満です。

例

入力
preorder = [7, 3, 0, 9, 4, 6]inorder = [0, 3, 9, 7, 4, 6]
出力
[7, 3, 4, 0, 9, -1, 6]
説明
先行順はルートの7から始まります。これはinorderの位置3にあるため、0, 3, 9は左に、4, 6は右に進みます。4には右の子である6だけがあるため、インデックス5は-1のままです。
challenge icon

発展問題

明示的なスタックを使い、preorderを1回走査するだけで、再帰を使わずに木を再構築できますか?

コードをリセット
def buildTree(preorder, inorder):
    # ここにコードを書いてください

テスト #1

テスト #2

引数

preorder = [7, 3, 0, 9, 4, 6]
inorder = [0, 3, 9, 7, 4, 6]

期待される出力

[7, 3, 4, 0, 9, -1, 6]