1. 空 BST に 5 を挿入
  2. [10,5,15] に 7 -> [5,7,10,15]
  3. [10,5,15] に 20 -> [5,10,15,20]
  4. [10,5,15,3,7,null,18] に 1 -> [1,3,5,7,10,15,18]
  5. 重複 10 は無視
  6. 降順構築 [5,3,null,1] に 4 -> [1,3,4,5]
コース一覧
コンピューターサイエンス上級:アルゴリズムとデータ構造
BST に値を挿入する

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

探索、ソート、木、グラフ、動的計画法、貪欲法など、競技プログラミングや技術面接で問われる高度なアルゴリズムとデータ構造を学べるコースです。基本的な 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分

BST に値を挿入する

空いている枝は 6 か所あるのに、置ける場所は 1 つしかない

次の木に 9 を足したいとします。

diagram (will load when visible)

子のいない場所を数えると、3 の左右、7 の左右、15 の左、18 の左右と 6 か所あります。しかし 9 を置いてよいのは 7 の右だけです。他のどこに置いても、木の形としては成立するのに「順番に取り出すと昇順になる」という約束が壊れます。

この約束が二分探索木 (BST) の全部です。あるノードから見て、左にぶら下がる値はすべてそのノードより小さく、右にぶら下がる値はすべて大きい。直接の子だけでなく、その先の孫もひ孫も、です。

比べるたびに、行き先が 1 つに決まる

境目が決まっていれば、行き先は迷いようがありません。点数を 3 段階に分ける関数を思い浮かべてください。

JavaScript

// 別題材 — 境目が決まっていれば、行き先は 1 つ function grade(score) { if (score < 60) return "C"; if (score < 80) return "B"; return "A"; }

BST は、この境目がノードの値そのものになったものです。10 と比べて小さければ左、大きければ右。降りた先の 5 でまた比べ、7 でまた比べる。降りるほど境目が増えて、9 の居場所が絞られていきます。

行き止まりに着いたら、そこが置き場所

9 を入れるときの比較を並べると次のようになります。

今いるノード比較進む先
109 は 10 より小さい左の 5 へ
59 は 5 より大きい右の 7 へ
79 は 7 より大きい右へ。そこは空

空にたどり着いた時点で終わりです。「もっと良い場所があるかもしれない」と引き返す必要はありません。途中で 1 回でも違う方向へ進んでいたら約束が壊れるので、通れる道は最初から 1 本しかないのです。

同じ値がすでにある場合は、比較が「小さい」でも「大きい」でもない状態になります。今回はそこで何もせずに終わります。

配列で渡された木を、先にノードへ直す

課題の入力は [10, 5, 15, 3, 7, null, 18] のような、上の段から左詰めで並べた配列です。この形のまま枝をたどるのは骨が折れるので、先にノードの形へ組み直します。添字 i のノードの子は次の位置にいます。

JavaScript

const left = arr[2 * i + 1]; const right = arr[2 * i + 2];

null の位置は「そこにノードが無い」という意味なので、繋がずに飛ばします。組み直したら値を 1 つ入れ、最後に小さい順で取り出して配列にします。

解説

入れた後に取り出すところまでが戻り値です。木を直しただけで返すと、形は合っているのに答えが合いません。

要件

  1. 配列 arr は BFS 順、欠損ノードは null (Python では None) で表される
  2. BST の不変条件 (左 < 親 < 右) を守って挿入する
  3. 戻り値は挿入後の in-order 走査結果の整数配列。重複は無視する

入出力例

bstInsert([], 5) → [5] bstInsert([10,5,15], 7) → [5,7,10,15] bstInsert([10,5,15], 20) → [5,10,15,20] bstInsert([10,5,15,3,7,null,18], 1) → [1,3,5,7,10,15,18] bstInsert([10,5,15], 10) → [5,10,15] bstInsert([5,3,null,1], 4) → [1,3,4,5]

ヒント

まず配列をノードオブジェクトの木に組み立てると挿入処理が書きやすい

再帰関数 `insert(node, val)` を書き、`null` に当たったら新ノードを返すパターンが定番

最後に in-order 走査して配列に詰めて返せば良い

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

関連レッスン

  • BST から値を検索する

    BFS 順の配列で表された BST から目的の値を探し、見つかれば true、なければ false を返す関数を実装する。

  • BST の最小値と最大値

    BST の最小値と最大値を返す関数を実装する。BST では最小は左端、最大は右端という性質を活かす。

  • BST 妥当性チェック

    与えられた二分木が BST の不変条件を満たしているか判定する関数を実装する。

  • BST で k 番目に小さい値

    BST の in-order 走査が昇順になる性質を使い、k 番目に小さい値を返す関数を実装する。

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

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

  • 二分探索中央と比較して半分ずつ範囲を狭める探索
  • 関数処理に名前を付けて再利用できる単位
  • 配列サイズ固定の同型データの集まり
  • 戻り値呼び出し元への返答を表す点線矢印
  • None「値がない」ことを表す特別な値。
main.py
学習モード
エディタを読み込んでいます

メモ

BST に値を挿入する

⌘S で保存