概要
整数
n
に対し、値
1..n
を持つノードで構成される構造的に一意な BST(二分探索木)をすべて生成します。
- 各木は BST の性質を満たす(左部分木 < 根 < 右部分木)
- 同型でない木はすべて列挙する(順序は任意)
-
1 ≤ n ≤ 8の制約 -
n=8でも生成本数はカタラン数 C₈ = 1430と小規模
🎯 戦略
分割統治(根を全列挙 → 左右部分木の直積で合成)+区間メモ化により、重複計算を排除して出力サイズに近い計算量を実現します。
ステップバイステップ解説
Python実装(LeetCode形式)
視覚的図解
分割統治フローチャート
計算量
⏱️ 時間計算量
O(Cₙ · n)
Cₙ はカタラン数(第n項)。各木の構築に O(n) の操作が必要です。メモ化により重複計算を完全に排除し、出力サイズに近い下限に到達します。
💾 空間計算量
O(Cₙ · n)
出力(全木)が支配的。アルゴリズム側は区間メモ O(n²) 個の区間に対し、各区間が最大 O(Cₙ) 本の木を保持します。
| n | カタラン数 Cₙ | 生成本数 | 実行時間 |
|---|---|---|---|
| 1 | 1 | 1本 | 即時 |
| 2 | 2 | 2本 | 即時 |
| 3 | 5 | 5本 | 即時 |
| 8 | 1430 | 1430本 | <100ms |