問題
二分木の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、
入力
root = [6, 3, 9, 1, 4, 8, 10]出力
[6, 9, 3, 10, 8, 4, 1]例 2
右の
入力
root = [2, null, 5]出力
[2, 5]例 3
空の木です。
入力
root = []出力
[]面接での聞かれ方
面接では、
- 「二分木を
左右反転してください」 - 書き終えた
あとに 「再帰を 使わずに 書けますか?」と、 待ち 行列や スタックでの 書き方を 聞かれます - 「元の
木を 壊さずに、 新しい 木を 返すには どうしますか?」と 聞かれる こともあります
書き換えて
アルゴリズムのチートシートの「再帰と木」に、この型の要点を表とコードでまとめています。
まず 考える手順
段 1
根だけを
段 2
木は
段 3
止まる
解答
Python
Python
def mirror_tree(root):
if root is None:
return None
a = root.left
b = root.right
root.left = mirror_tree(b)
root.right = mirror_tree(a)
return rootJavaScript
JavaScript
function mirrorTree(root) {
if (root === null) {
return null;
}
const a = root.left;
const b = root.right;
root.left = mirrorTree(b);
root.right = mirrorTree(a);
return root;
}Go
Go
func mirrorTree(
root *TreeNode,
) *TreeNode {
if root == nil {
return nil
}
a, b := root.Left, root.Right
root.Left = mirrorTree(b)
root.Right = mirrorTree(a)
return root
}元のa と b にroot.left をroot.left を
計算量
- 時間は O(n) です。
どの 節にも 1 回ずつ 行き、 左右の 付け替えを 1 回します - 使う
記憶は O(h) です。 h は 木の 高さで、 再帰の 呼び出しが 深さの 分だけ積まれます。 1 本道の 木では O(n) になります
よく ある間違い
- 書き換えてから、
もう 片方を読む。 変数に 受けずに root.left = mirror_tree(root.right)のあとに root.right = mirror_tree(root.left)と書くと、 2 行目の root.leftはもう 反転済みの 右の 部分木です。 元の 左の 部分木は 失われ、 右の 部分木が 2 回反転されて元に 戻ったまま、 左右の 両方に 付きます。 両方の 結果を 先に 変数へ受けます - 根だけ
入れ替える。 根の 左右を 入れ替えただけでは、 例 1 は [6, 9, 3, 8, 10, 1, 4]になり、 下の 段の 順が 逆に なりません - 空の
木で止まる。 root.leftを読む前に、 rootが空かを 確かめます
解答を動かした版 Python 3.12.14Node.js 22.23.4Go 1.24.6確認日 2026年10月30日
面接での 話し方の例
書き始める
「根の
左右を 入れ替えるだけでは 下の 段が 残るので、 再帰で 書きます。 左の 部分木と 右の 部分木を それぞれ先に 反転し、 根の 左に 右の 結果を、 右に 左の 結果を 付けます。 空の 木は そのまま 返します。 どの 節にも 1 回行くので 時間は O(n)、 記憶は 木の 高さの 分です。」
書き終えたら、
「例 1 で
たどります。 3 の 下の 1 と 4 を 入れ替えて 4, 1に、9 の 下の 8 と 10 を 入れ替えて 10, 8にします。最後に 根 6 の 左右を 入れ替えるので、 9 が 左、 3 が 右に 来て、 段の 順に 読むと 6, 9, 3, 10, 8, 4, 1です。」
