Menu
CoddyTech

Top View of Binary Tree

ヒープ順で配列 root に格納された二分木が与えられます。根はインデックス 0 にあり、インデックス i の子は 2*i+1(左)と 2*i+2(右)にあり、空の位置は -1 です。

根は列 0 にあります。左の子は親の1列左に、右の子は1列右に位置します。上から見ると、各列で最も深さの浅いノードが見えます。同じ深さのノードが複数ある場合は、そのレベルで左から右に並べたときに最初のノード(インデックスが小さいノード)を選びます。見える値を、最も左の列から最も右の列の順に返してください。

関数

topView(root: integer-array) → integer-array
rootinteger-array
空の位置を -1 とした、ヒープ順序の木
戻り値integer-array
各列を上から見た値。左端の列から順に

制約

  • 1 ≤ root.length ≤ 32767
  • 各 root[i] は -1 または 0 ≤ root[i] ≤ 104 を満たす値であり、同じ値は2回現れません。
  • root[0] は決して -1 ではないため、ツリーには少なくとも1つのノードがあります。
  • 配列は、最後のノードの後に余分な -1 のエントリが続いて終わる場合があります。
  • 空の位置の子はどちらも空であり、木のレベル数は最大でも 14 です。

例

入力
root = [5, 2, 9, 4, 7, 1, 6]
出力
[4, 2, 5, 9, 6]
説明
左から右へ、列には4(列 -2)、2(-1)、根の5(0)、9(1)、6(2)が入っています。7と1も列 0 にありますが、根はそれらの上にあります。
challenge icon

発展問題

配列の代わりにノードオブジェクトを使う場合、同点を決めるインデックスはありません。同点の場合のルールをどのように定めますか。また、幅優先探索のコードは変わりますか?

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

テスト #1

テスト #2

テスト #3

引数

root = [5, 2, 9, 4, 7, 1, 6]

期待される出力

[4, 2, 5, 9, 6]