ゆめさくエンジニア研究所
木の走査問題 15

木の​深さを求める

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

問題

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

  • 各節は、値 val、左の子 left、右の子 right を持ちます。子が無いところは、Python では None、JavaScript では null です
  • 例では、木を上の段から順に、各段を左から右へ読んだ値の並びで書きます。子が無いところは null です。空の木は root = [] です
  • 節の数は 0 以上 1000 以下、値はどれも -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 と数える、と先に確かめてから書くと安心です。

まず考える手順

段 1

まずは小さい木で考えます。空の木は 0 段、根だけの木は 1 段です。根に子が付くと、その子の下にどれだけ段が続くかで深さが決まります。

段 2

根から見た深さは、左の子の木の深さと右の子の木の深さの大きい方に、根の 1 段を足した数です。左右の子の木も同じ形の問題なので、同じ関数を子に向けて呼べば求まります。これが深さ優先の再帰です。

段 3

再帰の止まるところは、空の木で 0 を返す 1 か所だけです。葉では左右がどちらも空なので 0 と 0 の大きい方に 1 を足して 1 になり、特別に扱う必要はありません。

段 4

再帰を使わない書き方もあります。根だけを入れた並びから始め、いまの段の節を全部取り出して、その子を次の段の並びに入れます。これを並びが空になるまで繰り返し、繰り返した回数を数えると段の数になります。段ごとに数えるので、幅優先と呼ばれます。

ここから​解答です。​先に​自分で​書いてから​読むと、​考え方が​残ります。

解答

Python

Python

def tree_depth(root):
    if root is None:
        return 0
    lh = tree_depth(root.left)
    rh = tree_depth(root.right)
    return max(lh, rh) + 1

JavaScript

JavaScript

function treeDepth(root) {
  if (root === null) {
    return 0;
  }
  const { left, right } = root;
  const lh = treeDepth(left);
  const rh = treeDepth(right);
  return Math.max(lh, rh) + 1;
}

空の木を 0 段と決めてあるので、葉も、子が片方だけの節も、同じ 1 行で扱えます。

計算量

  • 時間は O(n) です。どの節も 1 回ずつ訪れます
  • 使う記憶は O(h) です。h は木の深さで、再帰の呼び出しが h 段まで積み重なります。例 2 のように片側に伸びた木では、h は n と同じになります
  • 段 4 の幅優先の書き方も、時間は O(n) です。記憶は 1 つの段に並ぶ節の数だけ使います

よくある間違い

  • 空の木を考えない。先に root.left を読むと、空の木で落ちます。空なら 0 を返す行を一番先に置きます
  • 葉で止めようとして子が片方の節で間違える。「左右とも空なら 1」だけを止まるところにすると、子が片方だけの節で空の側を読みに行って落ちます。空の木を 0 とする 1 か所にまとめると安全です
  • 大きい方でなく小さい方を取る。深さは一番遠い葉までなので、左右の大きい方を取ります。小さい方を取ると、一番近い葉までの段の数という別の答えになります

面接での話し方の例

書き始める前に、方針を短く口に出します。

「深さは、左右の子の木の深さの大きい方に 1 を足した数です。空の木を 0 段として、再帰で書きます。どの節も 1 回ずつ見るので時間は O(n)、記憶は木の深さの分だけ使います。」

書き終えたら、例を 1 つ手でたどって見せます。

「例 1 でたどります。7 は下の 5 が 1 段なので 2 段です。2 も下の 1 が 1 段なので 2 段です。根の 4 は 2 段と 2 段の大きい方に 1 を足して 3 段になります。再帰が深くなりすぎるのが心配なら、段ごとに数える幅優先でも書けます。」

解答を動かした版 Python 3.12.14Node.js 22.23.4確認日 2026年10月24日

コーディング面接問題の一覧へ戻る