深さ優先探索 (DFS) で二分木の深さを求める

二分木の根から一番遠い葉までの段の数を返す。左右の子の深さを先に求めて 1 を足す、深さ優先の再帰の練習です。

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

問題

二分木の根 root を受け取ります。根から一番遠い葉までに通る段の数を返す関数を書いてください。根だけの木なら 1、空の木なら 0 です。

  • 各節は、値 val、左の子 left、右の子 right を持ちます。子が無いところは、Python では None、JavaScript では null、Go では nil です。Go の節は TreeNode で、Val、Left、Right と大文字で始まります
  • 例では、木を上の段から順に、各段を左から右へ読んだ値の並びで書きます。子が無いところは null です。空の木は root = [] です
  • 節の数は 0 以上 500 以下、値はどれも -1000 以上 1000 以下です

入力と出力の例

例 1

根 4 の下に 7 と 2、7 の右に 5、2 の左に 1 がある木です。一番深いのは 5 と 1 の段で、3 段です。

root = [4, 7, 2, null, 5, 1]
3

例 2

左の子だけが続く木です。片側に伸びても、数えるのは段の数です。

root = [1, 2, null, 3, null, 4]
4

例 3

空の木は 0 段です。

root = []
0

面接での聞かれ方

面接では、問題文がもっと短く渡されることが多いです。

  • 「二分木の最大の深さを返してください」
  • 書き終えたあとに「再帰を使わずに書けますか?」と続けて聞かれます
  • 「木がとても深いと、何が困りますか?」と、再帰の深さを聞かれることもあります

深さを「段の数」で数えるのか「辺の数」で数えるのかで、答えが 1 つずれます。根だけなら 1 と数える、と先に確かめてから書くと安心です。

ヒント

まだ開いていません

付箋は 4 枚。下の段ほど答えに近づきます

  1. ヒント 2

  2. ヒント 3

  3. ヒント 4答えに近い

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

再帰は、同じ形の小さい問題に分けて自分を呼ぶ書き方です。木の深さや、全部の組み合わせを数える問題で使います。

main.py
def tree_depth(root: TreeNode | None) -> int:
    """
    Goal: 何を返すか

    idea1: まず思いつく案
    -> runtime: O(?)  space: O(?)

    idea2: もっと速い案
    -> runtime: O(?)  space: O(?)

    edge case: 空、1 つだけ、など
    """
    # root の節は val、left、right を持ちます。空きは None です
    # ここに書きます
    pass


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

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