1. 空木から削除 -> []
  2. [10] から 10 削除 -> []
  3. [10,5,15] から 葉 5 削除 -> [10,15]
  4. [10,5,15,3,7,13,20] から 子2つ 15 削除 -> [3,5,7,10,13,20]
  5. [10,5,15,3,7,13,20] から ルート 10 削除 -> [3,5,7,13,15,20]
  6. [10,5,15,null,7] から 子1つ 5 削除 -> [7,10,15]
  7. [10,5,15] から 存在しない 999 -> [5,10,15] 変化なし
コース一覧
コンピューターサイエンス上級:アルゴリズムとデータ構造
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 から値を削除する

抜いた後の穴に、誰を入れるか

削除がこれまでの操作と違うのは、外した後に穴が残るところです。

葉なら、そのまま外して終わりです。子が 1 つだけなら、その子を自分の位置へ繰り上げれば、上下の関係は保たれたままになります。困るのは子が 2 つあるときで、繰り上げたい相手が 2 人います。

diagram (will load when visible)

15 の位置に 13 を上げると、20 の置き場所がありません。20 を上げれば今度は 13 があぶれます。片方を上げるだけでは終わらないのです。

JavaScript

// よくある間違い — 左の子をそのまま繰り上げる node.val = node.left.val; // 右に残った値との関係が崩れる

穴を埋められるのは「すぐ次に大きい値」だけ

15 の穴に入る値には条件があります。左に残る 13 より大きく、右に残る 20 より小さいこと。この 2 つを同時に満たす値は、右側にいる値の中で一番小さいものしかありません。それより大きい値を持ってくれば右側の誰かを追い越しますし、左側から持ってくれば左に残った値を追い越します。

右側で一番小さい値は、前回作った歩き方でそのまま見つかります。消したいノードの右の子から出発して、左へ行けなくなるまで降りるだけです。

左側で一番大きい値を持ってきても、同じ理由で成り立ちます。どちらの流儀を選んでも構いません。

根を消す場合も特別扱いは要りません。[10, 5, 15, 3, 7, 13, 20] の木から 10 を消すなら、右側の 15 から左へ 1 歩降りた 13 が穴に入ります。取り出すと 3, 5, 7, 13, 15, 20 になり、10 だけがきれいに抜けています。

値を移したら、移した元を消す

ここが一番落ちるところです。穴の値を書き換えただけで終わると、木の中に同じ値が 2 つ残ります。

diagram (will load when visible)

持ってきた元のノードも消さなければいけません。ただし、この 2 回目の削除は簡単です。右側で一番小さいノードは、定義からして左の子を持ちません。つまり子は 0 個か 1 個で、最初に見た 2 つの形のどちらかに必ず落ちます。同じ手続きをもう一度呼べば片付きます。

親との繋ぎ直しを忘れない

もう 1 つ多いのが、外したノードの親が古い枝を掴んだままになる形です。子を繰り上げたときは、親が持つ左または右の参照を、その子に付け替える必要があります。付け替えを忘れると、木の見た目は変わらず、消したはずの値が取り出せてしまいます。

根を消すときも同じです。根そのものを差し替えないと、呼び出し側は消える前の木を持ち続けます。木が 1 ノードだけの場合は、根を消した結果が空の木になります。

無い値を消すよう頼まれた場合は、何もせず元の並びをそのまま返します。行き止まりまで降りて見つからなかった、というだけのことです。

要件

  1. 削除対象が葉 / 子 1 つ / 子 2 つ の 3 ケースを正しく扱う
  2. 子 2 つの場合は in-order 後継 (右部分木の最小) で置き換える
  3. 存在しない値の削除は何もせず in-order を返す。空木は空配列を返す

入出力例

bstDelete([], 5) → [] bstDelete([10], 10) → [] bstDelete([10,5,15], 5) → [10,15] bstDelete([10,5,15,3,7,13,20], 15) → [3,5,7,10,13,20] bstDelete([10,5,15,3,7,13,20], 10) → [3,5,7,13,15,20] bstDelete([10,5,15,null,7], 5) → [7,10,15] bstDelete([10,5,15], 999) → [5,10,15]

ヒント

再帰関数 `delete(node, val)` を書き、戻り値で親側の `left` / `right` を更新する

子 1 つ以下のケースは、残った子を返すだけで済む

子 2 つのケースは「右部分木の最小を見つけて値をコピー、その後右部分木から最小を削除」

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

関連レッスン

  • 第 3 章 まとめクイズ

    探索木 (BST) の挿入・検索・削除・妥当性チェックなど、第 3 章の要点を確認する 4 択クイズ。

  • hashmap で頻度集計

    配列の各要素が何回現れたかを `hashmap` で集計し、最も多く出た値を返す関数を実装する。

  • グラフ BFS で連結成分サイズを求める

    幅優先探索 (BFS) を使って、指定した頂点を含む連結成分のノード数を返す関数を実装する。

  • 編集距離 (レーベンシュタイン距離)

    2 つの文字列を一致させるために必要な最小編集回数を、二次元 DP で求める古典問題に挑戦します。

main.py
学習モード
エディタを読み込んでいます

メモ

BST から値を削除する

⌘S で保存