問題
二分木のroot1 と root2 を
- 各節は
val(値)、left(左の子)、 right(右の子) を 持ちます。 子が 無い ところは、 Python では None、JavaScript では null、Go では nilです。Go の 節は TreeNodeで、Val、Left、Rightと大文字で 始まります - 空の
木どうしは 同じと見ます - 節の
数は それぞれ 0 以上 100 以下、 値は どれも -10000 以上 10000 以下です
例では、null です。
入力と出力の例
例 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
形は
入力
root1 = [7, 5, 5]
root2 = [7, 5, 8]出力
false面接での聞かれ方
面接では、
- 「二分木が 2 つあります。
同じ 木か どうかを 判定してください」 - 書き終えた
あとに 「左右を 鏡に 映した 形と 同じか、に 変えられますか?」と 聞かれる ことがあります - 「再帰を
使わずに 書けますか?」と、 待ち行列での 書き方を 聞かれる こともあります
木の
アルゴリズムのチートシートの「再帰と木」に、この型の要点を表とコードでまとめています。
まず 考える手順
段 1
まず、null で
段 2
木は
段 3
再帰のval を
解答
Python
Python
def is_same_tree(root1, root2):
if root1 is None:
return root2 is None
if root2 is None:
return False
if root1.val != root2.val:
return False
a = root1.left
b = root2.left
if not is_same_tree(a, b):
return False
a = root1.right
b = root2.right
return is_same_tree(a, b)JavaScript
JavaScript
function isSameTree(
root1, root2
) {
if (root1 === null) {
return root2 === null;
}
if (root2 === null) {
return false;
}
if (root1.val !== root2.val) {
return false;
}
const l1 = root1.left;
const l2 = root2.left;
if (!isSameTree(l1, l2)) {
return false;
}
const r1 = root1.right;
const r2 = root2.right;
return isSameTree(r1, r2);
}Go
Go
func isSameTree(
root1, root2 *TreeNode,
) bool {
if root1 == nil {
return root2 == nil
}
if root2 == nil {
return false
}
if root1.Val != root2.Val {
return false
}
a, b := root1.Left, root2.Left
if !isSameTree(a, b) {
return false
}
a = root1.Right
b = root2.Right
return isSameTree(a, b)
}3 言語とも、root1 がroot2 もroot2 だけがval を
計算量
- 時間は O(n) です。
n は 節の 少ない方の 木の 節の 数で、 違いが 見つかった 所で 止まります。 同じ木なら 全部の 節を 1 回ずつ比べます - 使う
記憶は O(h) です。 h は 木の 高さで、 再帰の 呼び出しが 深さの 分だけ積まれます。 1 本道の 木では O(n) になります
よく ある間違い
- 値だけを
比べて、 空を 先に見ない。 root1.valを先に 読むと、 片方が 空の ときに 止まります。 空の 判定を 値の 比べより 前に置きます - 空きを
落として 並びに してから比べる。 例 2 の 2 本は、 空きを 書かずに 読むと どちらも [2, 6]になり、 同じと 判定してしまいます - 鏡の
形と 取り違える。 左と 右を 入れ替えて 比べるのは 「左右対称か」の 問題です。 この 問題は、 左どうし、 右どうしを比べます
解答を動かした版 Python 3.12.14Node.js 22.23.4Go 1.24.6確認日 2026年10月30日
面接での 話し方の例
書き始める
「並びに
直して 比べる ことも できますが、 空きの 扱いを 間違えると 形の 違いが 消えます。 木は 根と 左右の 部分木で できているので、 根の 値を 比べ、 左どうしと 右どうしを 同じ 関数で 再帰的に 比べます。 両方空なら真、 片方だけ 空なら偽を 先に 返します。 時間は O(n)、 記憶は 木の 高さの 分です。」
書き終えたら、
「例 2 で
たどります。 根は どちらも 2 で 同じです。 次に 左どうしを 比べると、 root1には 6 があり、 root2は空です。 片方だけ 空なので、 そこで 偽を 返して 終わります。」
