1. [1,2,3,null,4] -> [2,4,1,3]
  2. [1] -> [1]
  3. [1,2,3] -> [2,1,3]
  4. [1,null,2,null,null,null,3] -> [1,2,3]
  5. 完全二分木 [1..7] -> [4,2,5,1,6,3,7]
  6. [5,3,8,1,4,null,9] -> [1,3,4,5,8,9]
コース一覧
コンピューターサイエンス上級:アルゴリズムとデータ構造
二分木の in-order 走査

コンピューターサイエンス上級:アルゴリズムとデータ構造

探索、ソート、木、グラフ、動的計画法、貪欲法など、競技プログラミングや技術面接で問われる高度なアルゴリズムとデータ構造を学べるコースです。基本的な CS の知識を持ち、アルゴリズム力を伸ばしたい学習者や、外資・大手の技術面接対策をしたい方を対象としています。約 13 時間 (1 日 30 分 × 26 日) で 50 レッスンを修了でき、修了後はコーディング面接の実装問題を構造的に解けるようになります。

1
連結リスト
01. リンクリスト構築と長さの計算5分
02. リンクリストの反転5分
03. リンクリストのサイクル検出5分
04. ソート済みリンクリストの merge5分
05. リンクリストの中央ノード取得5分
06. ソート済みリストの重複削除5分
07. 第1章まとめクイズ5分
2
二分木
01. 二分木の in-order 走査5分
02. 二分木の pre-order 走査5分
03. 二分木の post-order 走査5分
04. 二分木の幅優先走査 (BFS)5分
05. 二分木の高さ5分
06. 二分木の平衡判定5分
07. 第2章まとめクイズ — 二分木5分
3
探索木 (BST)
01. BST に値を挿入する5分
02. BST から値を検索する5分
03. BST の最小値と最大値5分
04. BST 妥当性チェック5分
05. BST で k 番目に小さい値5分
06. BST から値を削除する5分
07. 第 3 章 まとめクイズ5分
4
ハッシュとセット
01. hashmap で頻度集計5分
02. キーでグループ化5分
03. two sum (hash で O(n))5分
04. 部分配列の和 = k の個数5分
05. 最長連続部分列5分
06. 集合の積 (intersection)5分
07. 第4章まとめクイズ5分
5
グラフ
01. グラフ BFS で連結成分サイズを求める5分
02. グラフ DFS で連結成分の数を数える5分
03. グラフのパス存在判定5分
04. BFS で最短経路の長さを求める5分
05. トポロジカルソート5分
06. 2 部グラフ判定5分
07. ダイクストラ法 — 重み付きグラフの最短経路15分
08. 第5章まとめクイズ — グラフ5分
6
動的計画法 (上級)
01. 編集距離 (レーベンシュタイン距離)5分
02. 最長増加部分列(LIS)の解法 ── AOJ 2430 対応の動的計画法5分
03. 最大部分配列和 (Kadane)5分
04. 隣り合わない最大値 (House Robber)5分
05. グリッド経路数 (Unique Paths)5分
06. 単語分割可能か (Word Break)5分
07. 第6章まとめクイズ — 動的計画法 (上級)5分
7
総合データ構造と関数型
01. map と filter を組み合わせる5分
02. reduce で積を計算5分
03. 関数合成5分
04. カリー化5分
05. trie の単純検索 (prefix マッチ)5分
06. Union-Find (連結成分数)5分
07. 最終総まとめクイズ5分

二分木の in-order 走査

連結リストは 1 本道でした。ここからは、各ノードが左と右の 2 つの行き先を持つ二分木を扱います。分かれ道が 1 つ増えただけで、変数を 1 つ進めていく書き方が通用しなくなります。

分かれ道に来るたび、片方を待たせることになる

左へ行けば右が残り、その右へ行けばまた分かれ道が待っています。「あとで戻ってくる場所」が次々に積み上がるので、今どこにいるかを指す変数を 1 つ持つだけでは足りません。

そこで再帰を使います。再帰は 2 つの部品でできています。1 つは、これ以上潜らないと決める行き止まりの条件。もう 1 つは、自分より小さい同じ形の問題を子に投げ、返ってきたものを組み立てる本体です。行き止まりを書き忘れると、無いノードにさらに潜って落ちます。この 2 つがそろっているかを、書くたびに確かめてください。

このコースでは木を、上の段から左詰めで並べた配列として受け取ります。番号 i のノードの子は、次の場所にいます。

Python

left = 2 * i + 1 right = 2 * i + 2

たとえば [1, 2, 3, None, 4] なら、1 が根、2 と 3 がその子、2 の左は空で右が 4 です。番号 3 の場所が空いているのは、位置で木の形を決めているからで、片側だけ伸びた木ほど配列に穴が増えます。

配列の外にはみ出したか、その場所が空なら、そこが行き止まりです。判定は「空かどうか」で書いてください。真偽で書くと、値が 0 のノードまで空として捨ててしまいます。

左を片付けてから、自分を出す

左、自分、右。この順で見るのが in-order です。数式を木にしたものを人が読む式へ戻す処理が、ちょうどこの順になります。

Python

def to_infix(node): if node is None: return "" if node.left is None and node.right is None: return str(node.value) return "(" + to_infix(node.left) + node.value + to_infix(node.right) + ")"

演算子を持つノードは、左の式を出し、自分の記号を挟み、右の式を出します。掛け算と足し算が混ざった木から (a * (b + c)) のような見慣れた形が戻ってきます。自分を左と右の間に置く、という順序がそのまま文字列の並びになっているのが分かります。

探索木なら、勝手に昇順で出てくる

in-order がよく使われる理由は別のところにあります。左の子には自分より小さい値、右の子には大きい値だけを置く、という決まりを守った木があります。その木を左、自分、右の順に見ると、出てくる値は必ず小さい順に並びます。

理由は単純です。自分を出す時点で、自分より小さいものは左側で出し終えています。そしてまだ出していないものは、全部自分より大きい。だから並べ替えを 1 回もせずに、歩くだけで整列した列が手に入ります。この性質のおかげで、そういう木は「並べ替え済みの入れ物」として使えます。

要件

  1. tree は BFS 順の配列で、null (Python では None) は欠損ノードを表す
  2. 再帰または反復で left -> root -> right の順に訪問する
  3. 戻り値は訪問順の値の配列 (List)。null は結果に含めない

入出力例

inorder([1,2,3,null,4]) → [2,4,1,3] inorder([1]) → [1] inorder([1,2,3]) → [2,1,3] inorder([1,null,2,null,null,null,3]) → [1,2,3] inorder([1,2,3,4,5,6,7]) → [4,2,5,1,6,3,7] inorder([5,3,8,1,4,null,9]) → [1,3,4,5,8,9]

ヒント

index i の左の子は 2*i+1、右の子は 2*i+2。範囲外または null なら子は存在しない

再帰関数 visit(i) を作り、visit(2*i+1) -> result.append(tree[i]) -> visit(2*i+2) の順に呼ぶ

基底ケースは「i が配列長以上」または「tree[i] が null」。両方とも何もせず return

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • 二分木の pre-order 走査

    二分木を配列表現で受け取り、pre-order (根 → 左 → 右) で訪問した値の配列を返す関数を実装する。

  • 二分木の post-order 走査

    二分木を配列表現で受け取り、post-order (左 → 右 → 根) で訪問した値の配列を返す関数を実装する。

  • 二分木の幅優先走査 (BFS)

    二分木を配列表現で受け取り、レベル順 (BFS) で訪問した値の配列を返す関数を実装する。

  • 二分木の高さ

    二分木を配列表現で受け取り、根から葉までの最大のノード数 (高さ) を返す関数を実装する。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 連結リスト各要素が次の要素へのポインタを持つ構造。
  • リスト順序付きで複数の値を扱うデータ構造
  • 二分木二分木は各ノードが最大2つの子を持つ木。
  • 変数データに名前をつけて参照する仕組み
  • 再帰関数が自分自身を呼び出す処理パターン
  • 配列サイズ固定の同型データの集まり
  • 処理計算や代入を表す長方形
  • 演算子//は切り捨て除算(7 // 2 = 3)。
main.py
学習モード
エディタを読み込んでいます

メモ

二分木の in-order 走査

⌘S で保存