再帰で二分木を左右反転する

二分木の​すべての​節で​左の​子と​右の​子を​入れ替え、​鏡に​映した​木を​返します。​下の​木を​先に​反転してから​付け替える、​木の​再帰の​基本の​練習です。

海外で定番の問題リスト 4 本のうち 4 本に入っています (Blind 75、NeetCode 150、Grind 75、LeetCode Top Interview 150)

問題

二分木の根 root を受け取ります。すべての節で左の子と右の子を入れ替え、左右を鏡に映した形にした木の根を返す関数を書いてください。

  • 各節は val (値)、left (左の子)、right (右の子) を持ちます。子が無いところは、Python では None、JavaScript では null、Go では nil です。Go の節は TreeNode で、Val、Left、Right と大文字で始まります
  • 受け取った木をそのまま書き換えて返してかまいません
  • 木が空のときは、空 (None、null、nil) を返します
  • 節の数は 0 以上 100 以下、値はどれも -100 以上 100 以下です

例では、木を上の段から左の順に読んだ値の並びで書きます。子が無いところは null で、末尾の null は書きません。

入力と出力の例

例 1

根が 6、その下が 3 と 9、さらに下が 1、4、8、10 の木です。反転すると、各段が右から読んだ順になります。

入力

root = [6, 3, 9, 1, 4, 8, 10]

出力

[6, 9, 3, 10, 8, 4, 1]

例 2

右の子だけを持つ木です。反転すると、5 は左の子になります。

入力

root = [2, null, 5]

出力

[2, 5]

例 3

空の木です。

入力

root = []

出力

[]

面接での聞かれ方

面接では、短く次のように渡されることが多いです。

  • 「二分木を左右反転してください」
  • 書き終えたあとに「再帰を使わずに書けますか?」と、待ち行列やスタックでの書き方を聞かれます
  • 「元の木を壊さずに、新しい木を返すにはどうしますか?」と聞かれることもあります

書き換えてよいのか、新しい木を作るのかを最初に確かめておくと、記憶の話までまとめて答えられます。

アルゴリズムのチートシートの「再帰と木」に、​この​型の​要点を​表と​コードで​まとめています。

main.py
def mirror_tree(root):
    # root の節は val、left、right を持ちます。空きは None です
    # ここに書きます
    pass


# 「実行」を押すと、この行の結果が出ます
# build_tree は、例と同じ並びから木を組みます
print(mirror_tree(build_tree([6, 3, 9, 1, 4, 8, 10])))

できているか「例で確かめる」を押すと、問題の例を全部この関数に渡して、通ったかをここに出します