1. 空木 -> []
  2. [42] -> [42, 42]
  3. [10,5,15] -> [5, 15]
  4. [10,5,15,3,7,13,20] -> [3, 20]
  5. 左偏 [10,5,null,3] -> [3, 10]
  6. 右偏 [1,null,2,null,null,null,3] -> [1, 3]
コース一覧
コンピューターサイエンス上級:アルゴリズムとデータ構造
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 の最小値と最大値

最小値を知るために、15 個すべてを見ていませんか

ただ並んでいるだけの 15 個から最小値を探すなら、15 個全部と比べるしかありません。1 個でも飛ばすと、そこに最小値がいたかもしれないからです。

木ではそうなりません。最小値がどこにいるかが、値を見る前から決まっています。

行き止まりが答え

diagram (will load when visible)

10 の左には 5、その左には 3 がいて、3 には左の子がいません。ここで考えてみてください。3 より小さい値がこの木のどこかにあるとしたら、それは 3 の左にぶら下がっているはずです。左が空である以上、そんな値は入っていません。

だから手続きは「左へ行けなくなるまで降りる」だけで終わります。降りきったノードの値が、そのまま最小値です。最大値も同じで、今度は右へ行けなくなるまで降ります。

歩数左へ降りる右へ降りる
01010
1515
23 で左が空20 で右が空

比較は片側 2 回、両方合わせても 4 回です。15 個を見比べる必要はどこにもありませんでした。途中の値を覚えたり比べたりする作業も要りません。降りることだけに集中します。

行き止まりの見分け方を間違える

うまくいかないときに多いのが、行き止まりの判定を「子が 1 つも無い」と書いてしまう形です。[10, 5, null, 3] という木を思い浮かべてください。10 の左が 5、5 の左が 3 で、右側には誰もいません。

最大値を探して根から右へ降りようとすると、10 には右の子がいません。ここが行き止まりなので、答えは根の 10 です。ところが「子が 1 つも無い」を条件にすると、10 は左に 5 を持っているので行き止まりと見なされず、いない右の子へ降りようとして落ちます。

見るのは進む方向の子だけです。最小を探しているなら左の子、最大なら右の子。反対側に子がいるかどうかは、この場面では関係ありません。

もう 1 つ、降りながら値を比べてしまう書き方も見かけます。「今までで一番小さかった値」を持ち回る必要はありません。着いた先が答えだと分かっているので、比較は進む方向を決めるためだけに使います。

空の木では何を返すか

ノードが 1 つも無ければ、最小も最大もありません。今回は空の配列を返す約束です。null や 0 を返すと、呼ぶ側が「値が無い」と「値が 0 だった」を区別できなくなります。

逆にノードが 1 つだけの木では、最小も最大も同じ値になります。左にも右にも降りられないので、その場の値が両方の答えです。

解説

根が答えになる形は珍しくありません。左に伸びた木では最大値が根、右に伸びた木では最小値が根です。

要件

  1. BST の最小は最左ノード、最大は最右ノードという性質を利用する
  2. 戻り値は [min, max] の 2 要素配列。空木のみ空配列を返す
  3. 両方の値を探すために木を全走査する必要はない (左右にだけ進む)

入出力例

bstMinMax([]) → [] bstMinMax([42]) → [42,42] bstMinMax([10,5,15]) → [5,15] bstMinMax([10,5,15,3,7,13,20]) → [3,20] bstMinMax([10,5,null,3]) → [3,10] bstMinMax([1,null,2,null,null,null,3]) → [1,3]

ヒント

ルートから左の子に進み続けた末端が最小値

ルートから右の子に進み続けた末端が最大値

ルートが空 (null) なら早期に空配列を返す

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

関連レッスン

  • BST 妥当性チェック

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

  • BST で k 番目に小さい値

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

  • BST から値を削除する

    BST から指定の値を削除し、削除後の in-order 走査結果を配列で返す関数を実装する。

  • 第 3 章 まとめクイズ

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

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

メモ

BST の最小値と最大値

⌘S で保存