再帰で 2 本の二分木が同じか確かめる

2 本の​二分木を​受け取り、​形も​値も​まったく​同じかを​返します。​根を​比べ、​左どうし、​右どうしを​同じ​関数に​任せる、​木の​再帰の​いちばん基本の​練習です。

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

問題

二分木の根 root1 と root2 を受け取ります。2 本の木が、形も、同じ位置にある値もすべて同じなら真、1 か所でも違えば偽を返す関数を書いてください。

  • 各節は val (値)、left (左の子)、right (右の子) を持ちます。子が無いところは、Python では None、JavaScript では null、Go では nil です。Go の節は TreeNode で、Val、Left、Right と大文字で始まります
  • 空の木どうしは同じと見ます
  • 節の数はそれぞれ 0 以上 100 以下、値はどれも -10000 以上 10000 以下です

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

入力と出力の例

例 1

どちらも、根が 3、その下が 9 と 4、9 の左に 1 がある木です。

入力

root1 = [3, 9, 4, 1]
root2 = [3, 9, 4, 1]

出力

true

例 2

値の並びは同じに見えますが、root1 の 6 は左の子、root2 の 6 は右の子です。形が違うので偽です。

入力

root1 = [2, 6]
root2 = [2, null, 6]

出力

false

例 3

形は同じですが、右下の値が 5 と 8 で違います。

入力

root1 = [7, 5, 5]
root2 = [7, 5, 8]

出力

false

面接での聞かれ方

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

  • 「二分木が 2 つあります。同じ木かどうかを判定してください」
  • 書き終えたあとに「左右を鏡に映した形と同じか、に変えられますか?」と聞かれることがあります
  • 「再帰を使わずに書けますか?」と、待ち行列での書き方を聞かれることもあります

木の問題では、「片方だけ空」の場合をどう扱うかを最初に口に出しておくと、書き落としが減ります。

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

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


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

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