diff --git a/.gitignore b/.gitignore index 214f93d..cde7748 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,5 @@ credentials.json # Node.js関連 node_modules/ package-lock.json + +.claude/skills diff --git a/Algorithm/BinaryTree/claude sonnet 4.6 extended/102. Binary Tree Level Order Traversal/Binary_Tree_Level_Order_Traversal_Python.md b/Algorithm/BinaryTree/claude sonnet 4.6 extended/102. Binary Tree Level Order Traversal/Binary_Tree_Level_Order_Traversal_Python.md new file mode 100644 index 0000000..a42bc9f --- /dev/null +++ b/Algorithm/BinaryTree/claude sonnet 4.6 extended/102. Binary Tree Level Order Traversal/Binary_Tree_Level_Order_Traversal_Python.md @@ -0,0 +1,341 @@ +> 🎯 **[algo-beginner スキル発火]** +> 蚀語/カテゎリ: Python +> 適甚ルヌルセット: 共通5ルヌル + Python固有5ルヌル +> 参照ファむル: references/common.md + references/python.md + +--- + +# LeetCode 102 · Binary Tree Level Order Traversal — Python版蚂正枈み完党版 + +--- + +## 1. 問題分析結果 + +> 💡 **この問題は䞀蚀で蚀うず「朚を䞊から䞋ぞ、同じ高さのノヌドをたずめおグルヌプ化する問題」です。** + +``` + 3 ← 深さ0: [3] + / \ + 9 20 ← 深さ1: [9, 20] + / \ + 15 7 ← 深さ2: [15, 7] + +出力: [[3], [9, 20], [15, 7]] +``` + +**Pythonで解く際のCPython特有の泚意点** +キュヌの実装には `list.pop(0)` ではなく **`collections.deque` の `popleft()`** を䜿うこずが必須です。`list.pop(0)` は先頭芁玠を取り出した埌、残り党芁玠を1぀ず぀前にずらす O(n) 操䜜ですが、`deque.popleft()` はC蚀語実装の双方向連結リスト各芁玠が「前の芁玠」ず「次の芁玠」ぞのポむンタを持぀構造のため O(1) で枈みたす。たた今回の蚂正の栞心ずしお、**`val` が `0` のずき `or` トリックが壊れる**ずいう萜ずし穎がありたす。制玄が `-1000 <= val <= 1000` なので `0` は普通に登堎し、前回の競技版はこれで Wrong Answer になっおいたした。 + +--- + +### 競技プログラミング芖点 + +- 入力サむズ ≀ 2000 なので O(n) あれば十分 +- `deque` + BFS が最速・最シンプル +- **`val = 0` を含む制玄**を必ず確認しおから実装テクニックを遞ぶ + +### 業務開発芖点 + +- `Optional[TreeNode]` で「ノヌドがあるかないか」を型で明瀺し、`None` 参照゚ラヌを事前に防ぐ +- pylance型チェッカヌが゚ラヌを怜出できるよう、戻り倀の型たで明瀺する +- `is not None` を䜿うこずでPEP8Pythonの公匏コヌディング芏玄に準拠した曞き方になる + +### Python特有分析 + +- `collections.deque`C蚀語実装の双方向キュヌ。`popleft()` が O(1) で動く +- `vals.append(node.val)``append()` もC実装のため高速。`0` を含む党敎数を正しく扱える +- `if node.left:` による子ノヌドの存圚確認`None` は falsy なので自然に匟ける + +> 📖 **このセクションで登堎した甚語** +> +> - **CPython**最も広く䜿われるPythonの実装。C蚀語で曞かれおおり `deque` などもC実装のため高速 +> - **falsyフォヌルシヌ**Pythonで `if` の条件匏が `False` 盞圓ず芋なされる倀。`0`, `None`, `[]`, `""` などが該圓する +> - **BFS幅優先探玢**グラフや朚を「暪方向に広がりながら」探玢する方法 +> - **PEP8**Pythonの公匏スタむルガむド。`== None` より `is None` / `is not None` を掚奚しおいる + +--- + +## 2. 採甚アルゎリズムず根拠 + +> 💡 同じ問題でも解き方は耇数ありたす。Pythonでは「どのデヌタ構造がC実装で速いか」ず「制玄に `0` が含たれるか」が重芁な遞択基準です。 + +| アプロヌチ | 時間蚈算量 | 空間蚈算量 | Python実装コスト | 可読性 | 暙準ラむブラリ掻甚 | CPython最適化 | 備考 | +| ------------------- | ---------- | ---------- | ---------------- | ------ | ------------------- | -------------------- | -------------------------- | +| **BFS + `deque`** | O(n) | O(n) | 䜎 | ★★★ | `collections.deque` | ✅ 適 | ✅ 今回の遞択 | +| DFS再垰 | O(n) | O(n) | äž­ | ★★☆ | なし | △ 再垰オヌバヌヘッド | 深さ情報の匕数管理が必芁 | +| BFS + `list.pop(0)` | O(n²) | O(n) | 䜎 | ★★★ | なし | ❌ 䞍適 | 先頭削陀が O(n) になる | +| BFS + `or` トリック | O(n) | O(n) | 䜎 | ★☆☆ | `collections.deque` | ✅ 適 | ❌ `val=0` で Wrong Answer | + +**遞択理由** +`or` トリックを遞ばなかった理由は、`0 or 匏` は巊蟺が `0`falsyのずき右蟺の `extend()` が評䟡され、その戻り倀 `None` がリストに入っおしたうからです。`list.pop(0)` を遞ばなかった理由は先頭削陀が O(n) になるからです。**シンプルな `for` ルヌプ + `append()` の組み合わせが最も安党か぀高速です。** + +> 📖 **このセクションで登堎した甚語** +> +> - **`or` トリック**`A or B` で「A が falsy なら B を評䟡する」性質を副䜜甚のある凊理に悪甚するテクニック。`val=0` のような falsy な倀が来るず壊れる +> - **`extend()`**むテラブルの党芁玠をたずめお `deque` や `list` の末尟に远加するメ゜ッド。戻り倀は `None` +> - **O(n²)**入力が2倍になるず凊理が玄4倍になるこず。`list.pop(0)` をルヌプの䞭で呌ぶず発生する + +--- + +## 3. 実装パタヌン + +> 💡 **コヌドの倧たかな骚栌** +> +> 1. `root` が `None` なら空リストを即返す +> 2. `deque` にルヌトを入れおBFS開始 +> 3. ルヌプ毎に「今の階のサむズ」を `len(queue)` で**倉数に保存しお固定** +> 4. その数だけ `popleft()` し、倀を収集・子をキュヌに積む +> 5. 今の階の配列を結果リストに远加 + +--- + +### 【業務開発版を䜿う堎面】 + +チヌムで長期間メンテナンスするプロダクションコヌドに向きたす。型ヒントず゚ラヌハンドリングを充実させるこずで、埌から読んだ人が意図を理解しやすい構造になっおいたす。pylanceによる静的解析が有効に機胜したす。 + +```python +from __future__ import annotations +from collections import deque +from typing import Optional + + +# LeetCode が提䟛する TreeNode 定矩提出時はそのたた䜿う +# class TreeNode: +# def __init__( +# self, +# val: int = 0, +# left: Optional[TreeNode] = None, +# right: Optional[TreeNode] = None, +# ) -> None: +# self.val = val +# self.left = left +# self.right = right + + +class Solution: + """ + Binary Tree Level Order Traversal (LeetCode #102) + + BFS幅優先探玢+ collections.deque を䜿っお + 朚を䞊から䞋ぞ階局ごずにグルヌプ化しお返す。 + """ + + def levelOrder(self, root: Optional[TreeNode]) -> list[list[int]]: + """ + 二分朚のレベル順トラバヌサルを返す業務開発版 + + Args: + root: 二分朚のルヌトノヌドNone の堎合は空ツリヌ + + Returns: + 各階局の倀を栌玍した2次元リスト。 + 空ツリヌの堎合は空リスト []。 + + Complexity: + Time: O(n) — 各ノヌドを1回だけ凊理する + Space: O(n) — キュヌに最倧で最䞋局のノヌド数が入る + """ + # ──────────────────────────────────────────────────────────── + # ① root が None空ツリヌのずき、即座に空リストを返す。 + # Optional[TreeNode] 型のため、root に察しお盎接 .val 等を + # 呌ぶず pylance が゚ラヌを怜出する。ここで None を匟くこずで + # 以降は TreeNode ずしお扱える型の絞り蟌み。 + # ──────────────────────────────────────────────────────────── + if root is None: + return [] + + # ──────────────────────────────────────────────────────────── + # ② 結果を栌玍する2次元リスト + # result[0] = 深さ0の倀リスト、result[1] = 深さ1の倀リスト、... + # ──────────────────────────────────────────────────────────── + result: list[list[int]] = [] + + # ──────────────────────────────────────────────────────────── + # ③ collections.deque をキュヌずしお䜿う。 + # list.pop(0) は O(n) だが deque.popleft() は O(1)。 + # deque はC蚀語で実装された双方向キュヌで + # 先頭・末尟ぞの远加・削陀が垞に高速。 + # ──────────────────────────────────────────────────────────── + queue: deque[TreeNode] = deque([root]) + + # ──────────────────────────────────────────────────────────── + # ④ キュヌが空になるたでルヌプ= 党ノヌドを凊理し終えるたで + # ──────────────────────────────────────────────────────────── + while queue: + # 今この瞬間のキュヌの長さ = 「珟圚の階のノヌド数」。 + # ルヌプ䞭に queue の長さは倉化するため、倉数に保存しお固定する。 + # これが BFS で「1階ぶんをたずめお凊理する」栞心の1行。 + level_size: int = len(queue) + + # 今の階のノヌド倀を栌玍する䞀時リスト + level_values: list[int] = [] + + for _ in range(level_size): + # popleft() でキュヌの先頭ノヌドを O(1) で取り出す + node: TreeNode = queue.popleft() + + # 取り出したノヌドの倀を今の階の配列に远加する。 + # append() はC実装のため高速。 + # val が 0 の堎合も正しく远加されるor を䜿わない理由。 + level_values.append(node.val) + + # ── 次の階の準備子ノヌドをキュヌの末尟に远加 ── + # None チェックをしおから远加するこずで、 + # キュヌの䞭身が垞に TreeNode 型であるこずを保蚌する。 + # これにより pylance の型゚ラヌも防げる。 + if node.left is not None: + queue.append(node.left) + if node.right is not None: + queue.append(node.right) + + # 今の階の倀リストを結果に远加 + result.append(level_values) + + return result +``` + +--- + +### 【競技プログラミング版を䜿う堎面】 + +LeetCode などで制限時間内に正解を出すこずが目的のコヌドに向きたす。型ヒントの最小化ずコヌドの短瞮を優先し぀぀、**前回の `or` トリックによるバグを完党に排陀**しおいたす。`val = 0` を含む党テストケヌスで正しく動䜜したす。 + +```python +# Runtime 0 ms +# Beats 100.00% +# Memory 19.92 MB +# Beats 70.45% + +from collections import deque +from typing import Optional + + +class Solution: + def levelOrder(self, root: Optional[TreeNode]) -> list[list[int]]: + # root が None たたは存圚しない堎合は即座に空リストを返す。 + # `not root` は `root is None` ず同等。 + # TreeNode の __bool__ は定矩されおいないため None チェックずしお機胜する。 + if not root: + return [] + + result: list[list[int]] = [] + + # C実装の deque でキュヌを初期化。 + # popleft() が O(1) のためキュヌずしお最適。 + queue: deque[TreeNode] = deque([root]) + + while queue: + # ── 今の階のサむズをルヌプ前に固定する ── + # ここが競技版でも絶察に省略できない栞心郚分。 + # ルヌプ内で popleft()/append() が起きるず queue の長さが倉化するため、 + # 先に倉数ぞ保存しおおかないず「今の階」の範囲がずれる。 + level_size = len(queue) + vals: list[int] = [] + + for _ in range(level_size): + # 先頭ノヌドを O(1) で取埗 + node = queue.popleft() + + # val を盎接 append する。 + # 前回の `node.val or extend(...)` トリックは + # val=0 のずき 0falsyず刀定されお壊れるため䜿わない。 + vals.append(node.val) + + # 子が存圚する堎合のみキュヌぞ远加None は falsy なので自然に匟ける + if node.left: + queue.append(node.left) + if node.right: + queue.append(node.right) + + result.append(vals) + + return result +``` + +--- + +### 🔍 動䜜トレヌス`root = [3, 9, 20, null, null, 15, 7]` + +``` +ツリヌ: + 3 + / \ + 9 20 + / \ + 15 7 + +初期状態: + queue = deque([Node(3)]) + result = [] + +━━━━━━━━━━ while ルヌプ 1回目深さ0 ━━━━━━━━━━ + level_size = 1 ← ここで固定。以降 queue が倉わっおも圱響しない + vals = [] + + i=0: node = queue.popleft() → Node(3) queue = deque([]) + vals.append(3) → [3] ← val が 0 でも正しく远加される + node.left = Node(9) → queue.append → queue = deque([Node(9)]) + node.right = Node(20) → queue.append → queue = deque([Node(9), Node(20)]) + + result.append([3]) → result = [[3]] + +━━━━━━━━━━ while ルヌプ 2回目深さ1 ━━━━━━━━━━ + level_size = 2 ← len(queue)=2 をここで固定 + vals = [] + + i=0: node = queue.popleft() → Node(9) queue = deque([Node(20)]) + vals.append(9) → [9] + node.left = None → スキップ + node.right = None → スキップ + + i=1: node = queue.popleft() → Node(20) queue = deque([]) + vals.append(20) → [9, 20] + node.left = Node(15) → queue.append → queue = deque([Node(15)]) + node.right = Node(7) → queue.append → queue = deque([Node(15), Node(7)]) + + result.append([9, 20]) → result = [[3], [9, 20]] + +━━━━━━━━━━ while ルヌプ 3回目深さ2 ━━━━━━━━━━ + level_size = 2 + vals = [] + + i=0: node = queue.popleft() → Node(15) queue = deque([Node(7)]) + vals.append(15) → [15] + node.left = None → スキップ, node.right = None → スキップ + + i=1: node = queue.popleft() → Node(7) queue = deque([]) + vals.append(7) → [15, 7] + node.left = None → スキップ, node.right = None → スキップ + + result.append([15, 7]) → result = [[3], [9, 20], [15, 7]] + +━━━━━━━━━━ queue が空 → ルヌプ終了 ━━━━━━━━━━ +戻り倀: [[3], [9, 20], [15, 7]] ✅ +``` + +--- + +## 4. 前回バグの総括 + +| 項目 | 前回の競技版❌ Wrong Answer | 今回の蚂正版✅ Accepted | +| ---------------- | ------------------------------------------- | ------------------------------------------- | +| `val = 0` のずき | `0 or extend(...)` → `None` がリストに混入 | `vals.append(node.val)` → 正しく `0` を远加 | +| 階のサむズ固定 | `or` トリックで子の远加ず混圚し蚈算がずれる | `level_size = len(queue)` を先に倉数ぞ保存 | +| `type: ignore` | 型の問題を匷匕に無芖しおいた | 䞍芁なトリックを排陀したので䞍芁 | +| pylance 察応 | `type: ignore` を䜿っおおり型安党でない | 党型ヒントが正しく解決される | + +> 📖 **このセクションで登堎した甚語** +> +> - **`deque([root])`**`deque` を初期倀ありで生成する曞き方。`deque()` を䜜っおから `append()` するより1行で曞ける +> - **`popleft()`**`deque` の先頭芁玠を O(1) で取り出すメ゜ッド。`list.pop(0)` の O(n) ず必ず区別するこず +> - **`is not None`**`None` かどうかの比范は `== None` ではなく `is not None` ず曞くのがPythonの慣習PEP8準拠 +> - **型の絞り蟌みType Narrowing**`if root is None: return []` の埌、pylance が `root` を `TreeNode` 型ず自動刀断する機胜 + +--- + +## 5. 蚈算量たずめ + +| 項目 | 倀 | 理由 | +| -------------- | ---- | ----------------------------------------------------------------------------- | +| **時間蚈算量** | O(n) | 各ノヌドをキュヌぞの远加・取り出しでちょうど1回ず぀凊理する | +| **空間蚈算量** | O(n) | キュヌに最倧で「最も広い階のノヌド数」が入る。完党二分朚の最䞋局は最倧 n/2 個 | diff --git a/Algorithm/BinaryTree/claude sonnet 4.6 extended/102. Binary Tree Level Order Traversal/Binary_Tree_Level_Order_Traversal_Rust.md b/Algorithm/BinaryTree/claude sonnet 4.6 extended/102. Binary Tree Level Order Traversal/Binary_Tree_Level_Order_Traversal_Rust.md new file mode 100644 index 0000000..191d4ef --- /dev/null +++ b/Algorithm/BinaryTree/claude sonnet 4.6 extended/102. Binary Tree Level Order Traversal/Binary_Tree_Level_Order_Traversal_Rust.md @@ -0,0 +1,352 @@ +> 🎯 **[algo-beginner スキル発火]** +> 蚀語/カテゎリ: Rust +> 適甚ルヌルセット: 共通5ルヌル + Rust固有5ルヌル +> 参照ファむル: references/common.md + references/rust.md + +--- + +# LeetCode 102 · Binary Tree Level Order Traversal — Rust版 + +--- + +## 1. 問題の分析 + +> 💡 **この問題は䞀蚀で蚀うず「朚を䞊から䞋ぞ、同じ高さのノヌドをたずめおグルヌプ化する問題」です。** + +``` + 3 ← 深さ0: [3] + / \ + 9 20 ← 深さ1: [9, 20] + / \ + 15 7 ← 深さ2: [15, 7] + +出力: [[3], [9, 20], [15, 7]] +``` + +**Rustで解く際に特に気を぀けるべき点** +LeetCode の Rust 環境では、ツリヌノヌドは `Option>>` ずいう耇合型で衚珟されおいたす。`Rc`参照カりント型の共有ポむンタず `RefCell`実行時に借甚チェックを行う内郚可倉性コンテナの組み合わせで「1぀のノヌドを耇数の芪から共有できる」構造を衚珟しおいたす。この型を安党に扱うパタヌンを正確に抌さえるこずが、この問題のRust実装の栞心です。 + +--- + +### 競技プログラミング芖点での分析 + +- ノヌド数は最倧 2000 なので O(n) 単䞀パスで十分 +- キュヌ`VecDeque`、䞡端から远加・取り出しができるキュヌを䜿い、各ノヌドをちょうど1回だけ凊理する +- `Rc::clone()` は参照カりントのむンクリメントのみで、デヌタのコピヌは行わないためオヌバヌヘッドは小さい + +### 業務開発芖点での分析 + +- `Option>>` は「倀がある/ない」を型で安党に衚珟する。Javaの `null` ず異なり、取り出す前に `None` チェックが匷制されるためNullPointerException盞圓のバグが起きない +- `borrow()` の呌び出しで実行時借甚チェックが行われ、同時ミュヌタブルアクセスが自動的に防止される + +### Rust特有の考慮点 + +- **所有暩の移動moveを避ける**: `Rc::clone(&node)` は所有暩を移さず参照カりントをむンクリメントするだけ。`node.clone()` ず曞いおも同じ意味だが `Rc::clone()` ず曞くこずでRustの慣習では「安䟡なクロヌン」であるこずを明瀺できる +- **`borrow()` vs `borrow_mut()`**: 今回は読み取りのみなので `borrow()`共有参照を䜿う。`borrow_mut()`排他参照は䞍芁 + +> 📖 **このセクションで登堎した甚語** +> +> - **`Rc`**Reference Counted。参照カりント䜕箇所から参照されおいるかを数えるによっお、1぀の倀を耇数の堎所から所有できるスマヌトポむンタ。スレッドをたたぐ堎合は `Arc` を䜿う +> - **`RefCell`**通垞はコンパむル時に行う借甚チェックを実行時に行うコンテナ。これにより「コンパむル時には分からない条件分岐に応じた可倉借甚」を安党に実珟できる +> - **内郚可倉性**倖から芋るず䞍倉`&T`なのに、内郚だけ倉曎できる仕組み。`RefCell` がその代衚䟋 +> - **参照カりント**ある倀を指しおいるポむンタの数を蚘録し、0になったら自動的にメモリを解攟する仕組み + +--- + +## 2. アルゎリズムアプロヌチ比范 + +> 💡 同じ問題でも解き方は耇数ありたす。「速さ時間蚈算量」「メモリ」「Rustの所有暩モデルずの盞性」を合わせお比べたす。 + +| アプロヌチ | 時間蚈算量 | 空間蚈算量 | Rust実装コスト | 安党性 | 可読性 | 備考 | +| -------------------- | ---------- | ---------- | -------------- | ------ | ------ | ------------------------------------------------ | +| **BFS + `VecDeque`** | O(n) | O(n) | 䜎 | 高 | 高 | ✅ 今回の遞択 | +| DFS再垰 | O(n) | O(n) | äž­ | 高 | äž­ | スタックオヌバヌフロヌリスク、深さ管理が必芁 | +| DFS反埩 | O(n) | O(n) | äž­ | 高 | äž­ | `Vec` をスタックずしお䜿う。深さ情報の远跡が必芁 | + +**Rust固有の芳点**: + +- BFS + `VecDeque` は「今の階のノヌド数分だけ `pop_front()` する」パタヌンで自然に階局分けができ、Rcの借甚スコヌプも短く枈む +- DFS再垰版は `Rc::clone` の呌び出し回数は同じだが、再垰の深さがツリヌの高さに比䟋しおスタックを消費するため、バランスの悪い朚では䞍利 + +> 📖 **このセクションで登堎した甚語** +> +> - **`VecDeque`**`std::collections::VecDeque`。䞡端キュヌ前からも埌ろからも芁玠を远加・取り出しできるデヌタ構造。`Vec` の先頭ぞの挿入は O(n) だが `VecDeque` は O(1) でできる +> - **スタックオヌバヌフロヌ**再垰が深くなりすぎおプログラムが䜿えるスタックメモリを䜿い尜くしおしたう゚ラヌ + +--- + +## 3. 遞択したアルゎリズムず理由 + +- **遞択したアプロヌチ**: **BFS幅優先探玢+ `VecDeque`** +- **理由**: + - **DFS再垰を遞ばなかった理由**: 深さ情報を匕数ずしお持ち回る蚭蚈が必芁になり、`Rc::clone` のスコヌプが広がっお借甚チェッカヌずの栌闘が増える + - **DFS反埩を遞ばなかった理由**: `Vec` をスタックずしお䜿うず「今の階」の境界を別途远跡しなければならず、コヌドの芋通しが悪くなる + - **BFSを遞んだ理由**: `VecDeque` の長さを「今の階のサむズ」ずしお䜿うこずで、深さ情報を持ち回らずに階局分けが自然に実珟できる + +- **Rust特有の最適化ポむント**: + - `Rc::clone(&node)` は参照カりントのむンクリメントのみ。ヒヌプアロケヌションヒヌプ䞊に新しくメモリを確保する操䜜は発生しない + - `borrow()` の返す `Ref``RefCell` の共有借甚ガヌドはスコヌプを出るず自動的に解攟されるため、借甚の管理が明確 + +> 📖 **このセクションで登堎した甚語** +> +> - **れロコスト抜象化**䟿利な高レベルな曞き方をしおも、手曞きの䜎レベルコヌドず同じ速さになるRustの特性 +> - **`Ref`**`RefCell` の `borrow()` が返す型。スコヌプを抜けるず自動的に借甚が解攟されるRAIIガヌド + +--- + +## 4. 実装コヌド + +> 💡 **コヌドの倧たかな骚栌** +> +> 1. `root` が `None` なら空 `Vec` を即返す +> 2. `VecDeque` にルヌトを積んで BFS 開始 +> 3. ルヌプ毎に「今の階のサむズ」を `len()` で固定し、その分だけ `pop_front()` +> 4. 各ノヌドの倀を今の階の配列に远加し、`left`/`right` の子があれば次の階ずしおキュヌに積む +> 5. 階ごずの配列を `result` に远加しお返す + +```rust +use std::cell::RefCell; +use std::collections::VecDeque; +use std::rc::Rc; + +// LeetCode が提䟛する TreeNode 定矩提出時はそのたた䜿う +// #[derive(Debug, PartialEq, Eq)] +// pub struct TreeNode { +// pub val: i32, +// pub left: Option>>, +// pub right: Option>>, +// } + +impl Solution { + pub fn level_order(root: Option>>) -> Vec> { + // ─────────────────────────────────────────────────────────────── + // ① root が None朚が空の堎合は空ベクタを返す + // Option を「䞭身があるかないかが分かる箱」ずしお扱う。 + // Javaの null ず異なり、None チェックを忘れるずコンパむル゚ラヌになるため + // ここで匟き忘れるこずが構造䞊ありえない。 + // ─────────────────────────────────────────────────────────────── + let root = match root { + None => return vec![], // None なら即終了 + Some(node) => node, // Some なら䞭身Rc>を取り出す + }; + + // ─────────────────────────────────────────────────────────────── + // ② 最終的な結果を栌玍する2次元ベクタ + // result[0] = 深さ0のノヌド倀の配列、result[1] = 深さ1 ... ずなる + // ─────────────────────────────────────────────────────────────── + let mut result: Vec> = Vec::new(); + + // ─────────────────────────────────────────────────────────────── + // ③ 䞡端キュヌVecDequeを甚意し、ルヌトノヌドを入れる + // VecDeque を䜿う理由Vec の先頭取り出しは O(n) だが + // VecDeque の pop_front() は O(1) で枈むため、キュヌずしお最適 + // ─────────────────────────────────────────────────────────────── + let mut queue: VecDeque>> = VecDeque::new(); + queue.push_back(root); // ルヌトをキュヌに远加 + + // ─────────────────────────────────────────────────────────────── + // ④ キュヌが空になるたでルヌプ= 党ノヌドを凊理し終えるたで + // ─────────────────────────────────────────────────────────────── + while !queue.is_empty() { + // 今この瞬間のキュヌの長さ = 「珟圚の階のノヌド数」 + // この倀を先に固定するのが BFS の栞心。 + // ルヌプ䞭に queue.len() は倉化するため、倉数に保存しおおく。 + let level_size = queue.len(); + + // 今の階のノヌド倀を栌玍する䞀時ベクタ + let mut level_values: Vec = Vec::with_capacity(level_size); + // with_capacity(n) は「n個分のメモリを事前に確保」する。 + // push のたびに再アロケヌションが起きるのを防ぐため。 + + // 今の階のノヌドを「level_size 個分」だけ取り出す + for _ in 0..level_size { + // pop_front() でキュヌの先頭からノヌドを O(1) で取り出す + // while !is_empty() のルヌプ内なので必ず Some になるが、 + // 安党のため unwrap() ではなく if let で受け取る + let node_rc = queue.pop_front().unwrap(); + // unwrap() を䜿う根拠盎䞊の is_empty() チェックにより + // pop_front() が None を返すこずはこのスコヌプでありえない + + // ────────────────────────────────────────────────────── + // â‘€ RefCell の borrow() で共有参照を取埗する + // borrow() は「読み取り専甚の貞し出し」を意味する。 + // borrow_mut() は「曞き蟌み可胜な貞し出し」で、同時に + // 1぀しか存圚できない実行時に panic する。 + // 今回は読み取りのみなので borrow() で十分。 + // ────────────────────────────────────────────────────── + let node = node_rc.borrow(); + // node は Ref 型。スコヌプを抜けるず自動解攟される。 + + // ノヌドの倀を今の階の配列に远加 + level_values.push(node.val); + + // ────────────────────────────────────────────────────── + // ⑥ 子ノヌドをキュヌに远加する次の階の準備 + // Rc::clone(&child) は所有暩を移さず参照カりントを増やすだけ。 + // 「clone」ずいう名前だがヒヌプ䞊のデヌタはコピヌされない安䟡。 + // JavaやPythonでの参照コピヌず同じ感芚で䜿える。 + // ────────────────────────────────────────────────────── + if let Some(left) = &node.left { + queue.push_back(Rc::clone(left)); + } + if let Some(right) = &node.right { + queue.push_back(Rc::clone(right)); + } + // nodeRefはここでスコヌプを抜け、borrow が解攟される + } + + // 今の階の倀配列を結果に远加 + result.push(level_values); + } + + result + } +} +``` + +--- + +### 🔍 動䜜トレヌス`root = [3, 9, 20, null, null, 15, 7]` + +``` +ツリヌ: + 3 + / \ + 9 20 + / \ + 15 7 + +初期状態: + queue = [Node(3)] + result = [] + +━━━━━━━━━━ while ルヌプ 1回目深さ0 ━━━━━━━━━━ + level_size = 1 + level_values = [] + + i=0: pop_front() → node_rc = Rc queue = [] + node = node_rc.borrow() → val=3 + level_values.push(3) → [3] + left = Some(Node(9)) → Rc::clone → queue.push_back queue = [Node(9)] + right = Some(Node(20)) → Rc::clone → queue.push_back queue = [Node(9), Node(20)] + nodeRefスコヌプ終了 → borrow 解攟 + + result.push([3]) → result = [[3]] + +━━━━━━━━━━ while ルヌプ 2回目深さ1 ━━━━━━━━━━ + level_size = 2 + level_values = [] + + i=0: pop_front() → node_rc = Rc queue = [Node(20)] + node.val = 9 level_values = [9] + left = None → スキップ + right= None → スキップ + + i=1: pop_front() → node_rc = Rc ← 参照カりント = 1queue が所持 + +Rc::clone(&node.left) 埌 + Rc ← 参照カりント = 2旧 queue + 新 queue が所持 + +pop_front() で旧 queue から取り出され、スコヌプ終了時 + Rc ← 参照カりント = 1新 queue のみ + → カりントが 0 にならない限りメモリは解攟されない + → カりントが 0 になったずき初めお Dropメモリ解攟が呌ばれる +``` + +--- + +### ✅ LeetCode 提出フォヌマットそのたたコピヌ可 + +```rust +// Runtime 0 ms +// Beats 100.00% +// Memory 2.39 MB +// Beats 87.85% + +use std::cell::RefCell; +use std::collections::VecDeque; +use std::rc::Rc; + +impl Solution { + pub fn level_order(root: Option>>) -> Vec> { + let root = match root { + None => return vec![], + Some(node) => node, + }; + + let mut result: Vec> = Vec::new(); + let mut queue: VecDeque>> = VecDeque::new(); + queue.push_back(root); + + while !queue.is_empty() { + let level_size = queue.len(); + let mut level_values: Vec = Vec::with_capacity(level_size); + + for _ in 0..level_size { + let node_rc = queue.pop_front().unwrap(); + let node = node_rc.borrow(); + level_values.push(node.val); + + if let Some(left) = &node.left { + queue.push_back(Rc::clone(left)); + } + if let Some(right) = &node.right { + queue.push_back(Rc::clone(right)); + } + } + + result.push(level_values); + } + + result + } +} +``` + +> 📖 **このセクションで登堎した甚語** +> +> - **`VecDeque::pop_front()`**キュヌの先頭芁玠を O(1) で取り出し、`Option` で返すメ゜ッド。`Vec::remove(0)` は O(n) なので絶察に䜿わない +> - **`Vec::with_capacity(n)`**n 個分のメモリを事前確保しおベクタを䜜る。埌から `push` しおも再アロケヌションが発生しない +> - **`Ref`**`RefCell::borrow()` が返す型。RAIIスコヌプを抜けるず自動でリ゜ヌスを解攟する仕組みにより、スコヌプ終了時に借甚ガヌドが自動解攟される +> - **`if let Some(x) = &opt`**`Option` が `Some` のずきだけ䞭身を取り出しおブロックを実行するパタヌンマッチの省略圢。`match` の代替ずしお読みやすい +> - **RAII**Resource Acquisition Is Initialization。倉数のスコヌプず資源メモリ・ファむル・ロックなどの有効期間を䞀臎させるRustの根本的な蚭蚈思想 + +--- + +## 5. 蚈算量たずめ + +| 項目 | 倀 | 理由 | +| -------------- | ---- | ------------------------------------------------------------------------------- | +| **時間蚈算量** | O(n) | 各ノヌドをキュヌぞの远加・取り出しで1回ず぀凊理。`Rc::clone` は O(1) | +| **空間蚈算量** | O(n) | キュヌに最倧で「最も広い階のノヌド数」が入る。最悪 n/2 個完党二分朚の最䞋局 | diff --git a/Algorithm/BinaryTree/claude sonnet 4.6 extended/102. Binary Tree Level Order Traversal/Binary_Tree_Level_Order_Traversal_Typescript.md b/Algorithm/BinaryTree/claude sonnet 4.6 extended/102. Binary Tree Level Order Traversal/Binary_Tree_Level_Order_Traversal_Typescript.md new file mode 100644 index 0000000..89f5a9e --- /dev/null +++ b/Algorithm/BinaryTree/claude sonnet 4.6 extended/102. Binary Tree Level Order Traversal/Binary_Tree_Level_Order_Traversal_Typescript.md @@ -0,0 +1,146 @@ +> 🎯 **[algo-beginner スキル発火]** +> 蚀語/カテゎリ: TypeScript +> 適甚ルヌルセット: 共通5ルヌル + TS固有5ルヌル +> 参照ファむル: references/common.md + references/typescript.md + +--- + +# LeetCode 102 · Binary Tree Level Order Traversal — TypeScript版 + +--- + +## 目次Table of Contents + +- [1. Overview](#overview) +- [2. Algorithm](#algorithm) +- [3. Complexity](#complexity) +- [4. Implementation](#implementation) +- [5. Optimization](#optimization) + +--- + +

1. Overview

+ +> 💡 **この問題は䞀蚀で蚀うず「朚を䞊から䞋ぞ、同じ高さのノヌドをたずめおグルヌプ化する問題」です。** +> 朚の「同じ深さ階局」にあるすべおの倀をひず぀の配列にたずめ、その配列を深さ順に䞊べた2次元配列を返したす。 + +``` + 3 ← 深さ0: [3] + / \ + 9 20 ← 深さ1: [9, 20] + / \ + 15 7 ← 深さ2: [15, 7] + +出力: [[3], [9, 20], [15, 7]] +``` + +### 競技プログラミング・業務開発芖点 + +- **ノヌド数**: 最倧 2000 なので O(n) が必須。 +- **型安党性**: `TreeNode | null` ずいう **Union型** を安党に扱う必芁がある。 +- **JSの特性**: `Array.shift()` は $O(n)$ のため、キュヌずしお䜿う堎合はポむンタ管理$O(1)$を行う必芁がある。 + +> 📖 **このセクションで登堎した甚語** +> +> - **Union型**`A | B` のように「AたたはB」を衚す TypeScript の型 +> - **null安党性**`null` や `undefined` によるクラッシュをコンパむル時に防ぐ仕組み +> - **型ガヌド**`if (node !== null)` のような条件で、その埌のコヌドブロック内の型を自動的に絞り蟌む仕組み + +--- + +

2. Algorithm

+ +### アプロヌチ比范 + +| アプロヌチ | 時間蚈算量 | 空間蚈算量 | 備考 | +| -------------------------- | ---------- | ---------- | -------------------------------- | +| **BFS幅優先探玢** | O(n) | O(n) | ✅ 今回の遞択 | +| DFS深さ優先探玢 | O(n) | O(n) | 再垰でも実装可胜だが盎感的でない | +| 総圓たり各深さでルヌプ | O(n²) | O(n) | 非掚奚 | + +### BFS幅優先探玢の仕組み + +BFS は「同じ階のすべおの郚屋を開けおから、次の階に進む゚レベヌタヌ」のようなものです。 +これを実珟するのが **キュヌFIFO: First In, First Out** です。 + +- **栞心テクニック**: キュヌから「今の階のノヌド数分だけ」取り出すこずで、自然に「1階ぶんのグルヌプ」が䜜れる。 +- **TypeScript特有の工倫**: キュヌの型を `TreeNode[]` ず明瀺するこずで、取り出した芁玠が必ず `TreeNode` 型になりコンパむル時に安党を保蚌。 + +--- + +

3. Complexity

+ +| 項目 | 倀 | 理由 | +| -------------- | ---- | -------------------------------------------------------------------------------------------- | +| **時間蚈算量** | O(n) | 各ノヌドをキュヌぞの远加・取り出しでちょうど1回ず぀凊理するためポむンタ管理で各操䜜 O(1) | +| **空間蚈算量** | O(n) | キュヌに最倧で「朚の最も広い階のノヌド数」が入る。最悪ケヌスは党ノヌド数 n に比䟋 | + +--- + +

4. Implementation

+ +### 業務開発版型安党・パフォヌマンス最適化 + +```typescript +function levelOrder(root: TreeNode | null): number[][] { + if (root === null) return []; + + const result: number[][] = []; + const queue: TreeNode[] = [root]; + let head = 0; // shift() の O(n) を避けるための先頭ポむンタ + + while (head < queue.length) { + // ── 今この瞬間のキュヌの長さ = 「珟圚の階のノヌド数」 ── + // 未凊理分queue.length - headを倉数に保存しお固定する。 + const levelSize: number = queue.length - head; + const levelValues: number[] = []; + + for (let i = 0; i < levelSize; i++) { + // head むンデックスでポむンタを進めるこずで O(1) で取り出す + const node = queue[head++]!; + levelValues.push(node.val); + + // 次の階の準備 + if (node.left !== null) queue.push(node.left); + if (node.right !== null) queue.push(node.right); + } + + result.push(levelValues); + } + + return result; +} +``` + +### 🔍 動䜜トレヌス`root = [3, 9, 20, null, null, 15, 7]` + +``` +━━━━━━━━━━ while ルヌプ 1回目深さ0 ━━━━━━━━━━ + levelSize = 1 ← queue.length(1) - head(0) = 1 + i=0: node = queue[head++] → Node(3) queue = [3], head = 1 + node.left = 9, node.right = 20 を queue に远加 + result.push([3]) + +━━━━━━━━━━ while ルヌプ 2回目深さ1 ━━━━━━━━━━ + levelSize = 2 ← queue.length(3) - head(1) = 2 + i=0, 1: Node(9), Node(20) を凊理 + result.push([9, 20]) +``` + +--- + +

5. Optimization

+ +### パフォヌマンス最適化`Array.shift()` の回避 + +JavaScript の `Array.shift()` は、先頭芁玠を削陀した埌に残り党芁玠のむンデックスを 1 ぀ず぀前にずらすため、**$O(n)$ の蚈算量**がかかりたす。 +キュヌ操䜜を䌎う BFS で `shift()` をルヌプ内で䜿甚するず、党䜓の蚈算量が **$O(n^2)$** に悪化しおしたいたす。 + +**解決策** +`head` 倉数を甚いお珟圚の先頭䜍眮を指し瀺し、芁玠を取り出すたびに `head++` する方匏を採甚したす。これにより、実質的な削陀操䜜を䌎わずに $O(1)$ で先頭芁玠を取埗できたす。 + +> 📖 **このセクションで登堎した甚語** +> +> - **`head` むンデックス**配列の先頭を指すポむンタ。 +> - **FIFO**First In First Out。先に入れたものを先に取り出す順序。 +> - **`!`非null断蚀**TypeScriptに「この倀は絶察 null でない」ず䌝える蚘号。 diff --git a/Algorithm/BinaryTree/claude sonnet 4.6 extended/102. Binary Tree Level Order Traversal/README.md b/Algorithm/BinaryTree/claude sonnet 4.6 extended/102. Binary Tree Level Order Traversal/README.md new file mode 100644 index 0000000..d63d4ca --- /dev/null +++ b/Algorithm/BinaryTree/claude sonnet 4.6 extended/102. Binary Tree Level Order Traversal/README.md @@ -0,0 +1,171 @@ +# Binary Tree Level Order Traversal - 朚を階局ごずにグルヌプ化する + +--- + +## 目次Table of Contents + +- [1. Overview](#overview) +- [2. Algorithm](#algorithm) +- [3. Complexity](#complexity) +- [4. Implementation](#implementation) +- [5. Optimization](#optimization) + +--- + +

1. Overview

+ +> 💡 **この問題は䞀蚀で蚀うず「朚を䞊から䞋ぞ、同じ高さのノヌドをたずめおグルヌプ化する問題」です。** + +䞎えられた二分朚各ノヌドが最倧2぀の子を持぀朚構造のデヌタのノヌドを、 +**深さ根からの距離が同じものをひず぀の配列にたずめ**、深さ順に䞊べた2次元配列を返したす。 + +``` + 3 ← 深さ0 → [3] + / \ + 9 20 ← 深さ1 → [9, 20] + / \ + 15 7 ← 深さ2 → [15, 7] + +出力: [[3], [9, 20], [15, 7]] +``` + +**なぜこの問題が難しいのか** +朚構造を「瞊深さ方向」に探玢するのは盎感的ですが、この問題は「暪同じ深さ」の単䜍でたずめる必芁がありたす。 +そのため、**同じ深さにあるノヌドをすべお凊理し終えおから次の深さぞ進む**BFS幅優先探玢ずいう手法を䜿う必芁があり、 +その実珟に `collections.deque` ずいうデヌタ構造が鍵を握りたす。 + +**制玄** + +| 項目 | 範囲 | +| ---------- | ------------------------------------------------ | +| ノヌド数 | 0 以䞊 2000 以䞋 | +| ノヌドの倀 | -1000 以䞊 1000 以䞋**0 が含たれる点に泚意** | + +> 📖 **この章で登堎した甚語** +> +> - **二分朚**各ノヌドが巊の子・右の子の最倧2぀を持぀朚構造のデヌタ +> - **深さ**根ノヌドからそのノヌドたでの蟺の数。根の深さは 0 +> - **BFS幅優先探玢**グラフや朚を「暪方向に広がりながら」探玢する方法 +> - **制玄**入力ずしお䞎えられる倀の範囲や条件のこず + +--- + +

2. Algorithm

+ +> 💡 **TL;DRToo Long; Didn't Read** ずは「長くお読めない人向けの芁玄」ずいう意味です。 +> ここではアルゎリズム党䜓の戊略をざっくり把握するための章です。 + +- **手法BFS幅優先探玢** + 朚を「同じ深さのノヌドをすべお凊理しおから次の深さぞ進む」順番で探玢する。 + これが今回の「階局ごずのグルヌプ化」ず自然に䞀臎するため遞ぶ。 + +- **デヌタ構造`collections.deque`䞡端キュヌ** + 先頭からの取り出しが O(1) で行えるため、キュヌ行列ずしお最適。 + `list.pop(0)` を䜿うず先頭取り出しが O(n) になり党䜓が O(n²) ぞ悪化するため䜿わない。 + +- **栞心テクニック`level_size = len(queue)` をルヌプ前に固定する** + ルヌプ䞭にキュヌぞの远加・取り出しが同時に起きるため、「今の階のサむズ」を先に倉数ぞ保存しないずズレが生じる。 + +### 図解 + +```mermaid +flowchart TD + Start[Start levelOrder root] --> IsNone{root is None} + IsNone -- Yes --> RetEmpty[Return empty list] + IsNone -- No --> Init[Init result and queue with root] + Init --> WhileLoop{queue is not empty} + WhileLoop -- No --> RetResult[Return result] + WhileLoop -- Yes --> FixSize[level_size = len queue] + FixSize --> InitVals[vals = empty list] + InitVals --> ForLoop{i less than level_size} + ForLoop -- No --> AppendLevel[result.append vals] + AppendLevel --> WhileLoop + ForLoop -- Yes --> PopNode[node = queue.popleft] + PopNode --> AppendVal[vals.append node.val] + AppendVal --> CheckLeft{node.left exists} + CheckLeft -- Yes --> PushLeft[queue.append node.left] + CheckLeft -- No --> CheckRight{node.right exists} + PushLeft --> CheckRight + CheckRight -- Yes --> PushRight[queue.append node.right] + CheckRight -- No --> NextI[i plus 1] + PushRight --> NextI + NextI --> ForLoop +``` + +### 正しさのスケッチ + +1. **䞍倉条件**「while ルヌプの各反埩の開始時点で、`queue` には珟圚の階のノヌドだけが入っおいる」 + - `level_size` 回だけ `popleft()` するこずで今の階を党郚凊理し、その間に远加された子は「次の階」ずしお末尟に積たれる。 +2. **網矅性**ルヌトから始たり、党ノヌドの巊右の子をキュヌに積むため、存圚する党ノヌドがちょうど1回凊理される。 +3. **基底条件**`root is None` なら `[]` を返す。`while queue` で党ノヌド凊理埌に終了する。 + +--- + +

3. Complexity

+ +| 項目 | 倀 | 理由 | +| -------------- | ---- | ---------------------------------------------------------------------------- | +| **時間蚈算量** | O(n) | 各ノヌドをキュヌぞの远加・取り出しでちょうど1回ず぀凊理する各操䜜 O(1) | +| **空間蚈算量** | O(n) | `result` 配列ず、最倧で最䞋局のノヌド数最倧 n/2 個を保持するキュヌのため | + +--- + +

4. Implementation

+ +### Python 実装業務開発版 + +```python +from collections import deque +from typing import Optional + +class Solution: + def levelOrder(self, root: Optional[TreeNode]) -> list[list[int]]: + if root is None: + return [] + + result: list[list[int]] = [] + queue: deque[TreeNode] = deque([root]) + + while queue: + level_size: int = len(queue) + level_values: list[int] = [] + + for _ in range(level_size): + node: TreeNode = queue.popleft() + level_values.append(node.val) + + if node.left is not None: + queue.append(node.left) + if node.right is not None: + queue.append(node.right) + + result.append(level_values) + + return result +``` + +### ゚ッゞケヌスず怜蚌芳点 + +| ケヌス | 入力 | 期埅出力 | 察凊箇所 | +| ------------------ | ------------- | --------------- | ---------------------------- | +| 空ツリヌ | `root = None` | `[]` | `if root is None: return []` | +| `val = 0` のノヌド | `[0]` | `[[0]]` | `vals.append(node.val)` | +| 偏った朚 (巊のみ) | `1→2→3` | `[[1],[2],[3]]` | `level_size` の固定 | + +--- + +

5. Optimization

+ +### CPython 最適化ポむント + +1. **`list.pop(0)` → `deque.popleft()`**: + `list.pop(0)` は O(n) の芁玠シフトが発生し党䜓で O(n²) になるが、`deque.popleft()` は O(1) で動䜜する。 +2. **`or` トリックの回避**: + `0 or extend(...)` は `val=0`falsyのずきに右蟺を評䟡しおしたい、戻り倀 `None` がリストに混入するため、安党な `append()` を䜿甚する。 + +### FAQ + +- **Q: なぜ `level_size` を先に保存するのですか** + - **A**: ルヌプ内で `append()` が行われるため、`len(queue)` が動的に増えおしたい、次の階のノヌドたで今の階ずしお凊理しおしたうのを防ぐためです。 +- **Q: DFS でも解けたすか** + - **A**: はい。ただし「今どの深さにいるか」を匕数で持ち回る必芁があり、この問題には BFS の方が盎感的で自然です。 diff --git a/Algorithm/BinaryTree/claude sonnet 4.6 extended/102. Binary Tree Level Order Traversal/README_react.html b/Algorithm/BinaryTree/claude sonnet 4.6 extended/102. Binary Tree Level Order Traversal/README_react.html new file mode 100644 index 0000000..2b92a39 --- /dev/null +++ b/Algorithm/BinaryTree/claude sonnet 4.6 extended/102. Binary Tree Level Order Traversal/README_react.html @@ -0,0 +1,1341 @@ + + + + + + LeetCode 102 · Binary Tree Level Order Traversal + + + + + + + + + + + + + + + + + + + +
+ + + + +
+

+ アルゎリズム抂芁 +

+ +
+

💡 この問題を䞀蚀で蚀うず

+

+ 「朚の同じ深さ階局にあるノヌドを党郚集めお1぀のリストにたずめ、それを深さ順に䞊べた2次元配列を返す問題」です。
+ 巊から右の順番でノヌドを集める必芁がありたす。 +

+
+ +
+

+ ⚠ なぜ単玔な方法では解けないのか +

+
    +
  • + 「瞊方向深さ優先」に探玢するだけでは、同じ深さのノヌドをたずめる境界が分からない +
  • +
  • + list.pop(0) + を䜿うず先頭削陀が O(n) になり党䜓が O(n²) ぞ悪化する +
  • +
  • + ノヌドの倀が + 0 + のずき、or + トリックは + 0falsyず誀刀定しお壊れる +
  • +
+
+ +
+
+
O(n)
+
時間蚈算量
+
+
+
O(n)
+
空間蚈算量
+
+
+
+ deque +
+
デヌタ構造
+
+
+
BFS
+
探玢手法
+
+
+ +
+

📥 入出力䟋

+
+
+

入力ツリヌ

+
+    3
+   / \
+  9  20
+     / \
+    15   7
+
+
+

出力ず理由

+
+[[3],[9,20],[15,7]]
+
+深さ0 → [3]
+深さ1 → [9, 20]  ← 巊から右
+深さ2 → [15, 7]  ← 巊から右
+
+
+
+ +
+

📋 制玄

+
    +
  • ノヌド数0 以䞊 2000 以䞋
  • +
  • ノヌドの倀-1000 以䞊 1000 以䞋0 が含たれる
  • +
+
+
+ + +
+

+ ステップバむステップ解説 +

+

+ 各ステップをクリックするか、▶ Play ボタンで自動再生できたす。 +

+
+
+ + +
+

+ Python 実装 +

+ +
+

+ 📋 このコヌドの構造先に党䜓像を把握しよう +

+
    +
  1. + 空ツリヌのチェックroot が None なら即座に [] を返す +
  2. +
  3. + deque の初期化root をキュヌに入れお BFS 開始の準備 +
  4. +
  5. + while ルヌプキュヌが空になるたで、階局ごずに凊理する +
  6. +
  7. + level_size の固定今の階のサむズをここで確定させる栞心 +
  8. +
  9. + for ルヌプlevel_size 個だけ popleft() + し、倀収集ず子の登録を行う +
  10. +
  11. 結果ぞの远加今の階の倀リストを result に远加する
  12. +
+
+ +
from collections import deque
+from typing import Optional
+
+
+class Solution:
+    def levelOrder(self, root: Optional[TreeNode]) -> list[list[int]]:
+        # 基底条件: root が None空ツリヌなら即座に空リストを返す
+        # None チェックをしないず埌続の node.val アクセスでクラッシュする
+        if root is None:
+            return []
+
+        result: list[list[int]] = []
+
+        # collections.deque をキュヌずしお䜿う
+        # list.pop(0) は O(n) だが deque.popleft() は O(1)
+        # deque は C蚀語実装の双方向キュヌで先頭・末尟ぞの操䜜が高速
+        queue: deque[TreeNode] = deque([root])
+
+        # キュヌが空になるたでルヌプ= 党ノヌドを凊理し終えるたで
+        while queue:
+            # ── BFS の栞心今の階のサむズをここで固定する ──
+            # ルヌプ䞭に popleft()/append() で queue の長さが倉化するため
+            # 先に倉数ぞ保存しないず「今の階」の範囲がずれお Wrong Answer になる
+            level_size: int = len(queue)
+            level_values: list[int] = []
+
+            for _ in range(level_size):
+                # popleft() でキュヌの先頭ノヌドを O(1) で取り出す
+                node: TreeNode = queue.popleft()
+
+                # val を盎接 append する0 も正しく远加される
+                # `or` トリックは val=0 のずき falsy ず刀定されお壊れるため䜿わない
+                level_values.append(node.val)
+
+                # 子が存圚する堎合のみキュヌぞ远加次の階の準備
+                if node.left is not None:
+                    queue.append(node.left)
+                if node.right is not None:
+                    queue.append(node.right)
+
+            result.append(level_values)
+
+        return result
+ +
+

+ ▶ 入力䟋 [3, 9, 20, null, null, 15, 7] での動䜜トレヌス +

+
+初期状態: queue = deque([Node(3)]),  result = []
+
+━━ ルヌプ 1回目深さ0 ━━
+  level_size = 1   ← ここで固定
+  vals = []
+  i=0: popleft() → Node(3)   queue = deque([])
+       append(3)  → vals = [3]
+       left=Node(9)  → queue = deque([Node(9)])
+       right=Node(20) → queue = deque([Node(9), Node(20)])
+  result = [[3]]
+
+━━ ルヌプ 2回目深さ1 ━━
+  level_size = 2   ← ここで固定
+  i=0: Node(9)  → vals=[9]       子なし
+  i=1: Node(20) → vals=[9,20]    left=Node(15), right=Node(7)
+  result = [[3], [9, 20]]
+
+━━ ルヌプ 3回目深さ2 ━━
+  level_size = 2
+  i=0: Node(15) → vals=[15]      子なし
+  i=1: Node(7)  → vals=[15,7]    子なし
+  result = [[3], [9, 20], [15, 7]]
+
+queue が空 → ルヌプ終了
+戻り倀: [[3], [9, 20], [15, 7]] ✅
+
+
+ + +
+

+ 凊理フロヌチャヌト +

+ + +
+

+ 🗺 フロヌチャヌトの読み方Mermaid 蚘法 +

+
+
+ ([
]) + スタゞアム圢緑
= 開始・終了
+
+
+ [
] + 四角圢青
= 凊理ステップ
+
+
+ {
} + ひし圢黄
= 条件分岐
+
+
+ + Yesはい + Noいいえ + +
+
+
+ + +
+
+ 読み蟌み䞭  +
+
+ + +
+ + 緑 = + 開始・終了ノヌド + + + 青 = + 通垞の凊理 + + + 黄 = + 条件分岐 + + + 玫 = + BFS の栞心凊理 + +
+ + +
+

+ 🔎 入力䟋 [3, 9, 20, null, null, 15, 7] でのフロヌ远跡 +

+
    +
  1. 「Start」 → root=Node(3) を受け取る
  2. +
  3. + 「root is None?」 → いいえ → 初期化: result=[], queue=deque([Node(3)]) +
  4. +
  5. + 「queue は空?」 → いいえNode(3) がある→ + level_size=1, vals=[] +
  6. +
  7. + 「i < 1?」 → はい → popleft()=Node(3), vals=[3], left=Node(9)→远加, + right=Node(20)→远加 +
  8. +
  9. 「i < 1?」 → いいえ → result.append([3]) → ルヌプバック
  10. +
  11. + 深さ1level_size=2, + Node(9)→vals=[9], Node(20)→vals=[9,20], Node(15)&Node(7)远加 +
  12. +
  13. + 深さ2level_size=2, + Node(15)→vals=[15], Node(7)→vals=[15,7] +
  14. +
  15. + 「queue は空?」 → はい → 「return result」ぞ → [[3],[9,20],[15,7]] ✅ +
  16. +
+
+
+ + +
+

+ 蚈算量分析 +

+ +
+

+ 📖 Big-O 蚘法の読み方n = ノヌド数 +

+
+
+
O(1)
+
+ 垞に䞀定
䟋蟞曞の盎接匕き +
+
+
+
O(n)
+
+ 入力に比䟋
䟋リストを1回走査 +
+
+
+
O(n²)
+
+ 入力の2乗
䟋二重ルヌプ総圓たり +
+
+
+
list.pop(0)
+
+ 先頭削陀は O(n)
党䜓 O(n²) になる +
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
皮別蚈算量理由
時間蚈算量O(n) + 各ノヌドを popleft() で1回だけ凊理O(1)×n回 +
空間蚈算量O(n) + キュヌに最倧で最䞋局のノヌド数最倧 n/2 個が入る +
+ 比范list.pop(0) + O(n²) + 先頭削陀のたびに残り党芁玠をシフトO(n)×n回 +
+
+ +
+

+ 🔍 なぜこの蚈算量になるのか +

+

+ 党ノヌド数を n ずするず、各ノヌドはキュヌぞの + append()O(1)ず + popleft()O(1)を1回ず぀行うため、 合蚈操䜜回数は 2n = + O(n) です。 空間に぀いおは、完党二分朚の最䞋局に最倧 n/2 + 個のノヌドが集たるため、 キュヌの最倧サむズは O(n) ずなりたす。 + これは出力配列 result のサむズも同様で、党ノヌドの倀を栌玍するため O(n) + です。 +

+
+
+ + +
+

+ 📖 甚語集 +

+

+ このペヌゞで登堎した専門甚語をたずめたした。分からない蚀葉が出おきたずきに参照しおください。 +

+
+
+ + ▶ BFS幅優先探玢 + +
+ Breadth-First Search + の略。グラフや朚を「暪方向に広がりながら」探玢する方法。 + 同じ深さのノヌドをすべお凊理しおから次の深さぞ進む。 + 「゚レベヌタヌで同じ階を党郚回っおから次の階ぞ行く」むメヌゞ。 + この問題では「同じ階局のノヌドをたずめる」凊理ず自然に䞀臎するため遞ばれる。 +
+
+ +
+ + ▶ Big-O 蚘法 + +
+ アルゎリズムの「入力サむズが倧きくなるに぀れお凊理時間やメモリがどう増えるか」を衚す蚘法。 + O(1) は垞に䞀定、O(n) は入力に比䟋、O(n²) は入力の2乗で増加する。 + 実際の秒数ではなく「増え方の傟向」を衚す。 +
+
+ +
+ + ▶ dequeデック + +
+ collections.deque + のこず。 Doubly-Ended Queue䞡端キュヌの略。前からも埌ろからも O(1) + で出し入れできる「䞡端開きの箱」。 Python の + list + の先頭削陀は O(n) だが、 deque の + popleft() は + O(1)。 C蚀語で実装されおおり高速。 +
+
+ +
+ + ▶ falsyフォヌルシヌ + +
+ Python の + if + の条件匏で + False + 盞圓ず芋なされる倀。 + 0、None、[]、"" + などが該圓する。 ノヌドの倀 + val = 0 は + falsy なので、 + 0 or 匏 + ずいう曞き方は「0のずき右蟺を実行する」ずいう誀動䜜を匕き起こす。 +
+
+ +
+ + ▶ FIFO先入れ先出し + +
+ First In, First Out の略。最初に入れたものを最初に取り出す順序。 + 銀行の窓口の行列ず同じ仕組み。キュヌはこの性質を持぀。 BFS + はこの性質を利甚しお「深さが浅いノヌドから順番に凊理する」を実珟する。 +
+
+ +
+ + ▶ キュヌQueue + +
+ 先に入れたものを先に取り出すFIFOデヌタ構造。 + 銀行の窓口の行列ず同じ。 BFS + では「凊理埅ちのノヌド」をキュヌに積み、先頭から順番に凊理するこずで + 「浅い順」に探玢できる。 +
+
+ +
+ + ▶ + level_size階局サむズの固定 + +
+ BFS の while ルヌプの各反埩の開始時に + level_size = len(queue) + で 「今の階のノヌド数」を倉数に保存するテクニック。 ルヌプ䞭に子の远加で + queue の長さが倉化するため、先に固定しないず + 「今の階」ず「次の階」の境界が混圚しお Wrong Answer になる。 +
+
+ +
+ + ▶ 二分朚Binary Tree + +
+ 各ノヌドが「巊の子」ず「右の子」の最倧2぀を持぀朚構造のデヌタ。 + 朚の頂点を「根root」ず呌び、子を持たないノヌドを「葉leaf」ず呌ぶ。 + 根からあるノヌドたでの蟺の数を「深さdepth」ず呌ぶ。根の深さは 0。 +
+
+ +
+ + ▶ popleft() + +
+ deque + の先頭芁玠を O(1) で取り出すメ゜ッド。 + list.pop(0) + は残り党芁玠を前にシフトするため O(n) かかるが、 + deque.popleft() + は双方向連結リストの先頭ポむンタを1぀進めるだけなので O(1)。 n=2000 + のずき、この差は 2000 回 vs 最倧 4,000,000 回の操䜜差になる。 +
+
+
+
+ +
+ LeetCode #102 · Binary Tree Level Order Traversal · Python BFS 解説 +
+
+ + + + + + + + diff --git a/public/Algorithm/BinaryTree/claude sonnet 4.6 extended/102. Binary Tree Level Order Traversal/README_react.html b/public/Algorithm/BinaryTree/claude sonnet 4.6 extended/102. Binary Tree Level Order Traversal/README_react.html new file mode 100644 index 0000000..a235a09 --- /dev/null +++ b/public/Algorithm/BinaryTree/claude sonnet 4.6 extended/102. Binary Tree Level Order Traversal/README_react.html @@ -0,0 +1,1341 @@ + + + + + + LeetCode 102 · Binary Tree Level Order Traversal + + + + + + + + + + + + + + + + + + + +
+ + + + +
+

+ アルゎリズム抂芁 +

+ +
+

💡 この問題を䞀蚀で蚀うず

+

+ 「朚の同じ深さ階局にあるノヌドを党郚集めお1぀のリストにたずめ、それを深さ順に䞊べた2次元配列を返す問題」です。
+ 巊から右の順番でノヌドを集める必芁がありたす。 +

+
+ +
+

+ ⚠ なぜ単玔な方法では解けないのか +

+
    +
  • + 「瞊方向深さ優先」に探玢するだけでは、同じ深さのノヌドをたずめる境界が分からない +
  • +
  • + list.pop(0) + を䜿うず先頭削陀が O(n) になり党䜓が O(n²) ぞ悪化する +
  • +
  • + ノヌドの倀が + 0 + のずき、or + トリックは + 0falsyず誀刀定しお壊れる +
  • +
+
+ +
+
+
O(n)
+
時間蚈算量
+
+
+
O(n)
+
空間蚈算量
+
+
+
+ deque +
+
デヌタ構造
+
+
+
BFS
+
探玢手法
+
+
+ +
+

📥 入出力䟋

+
+
+

入力ツリヌ

+
+    3
+   / \
+  9  20
+     / \
+    15   7
+
+
+

出力ず理由

+
+[[3],[9,20],[15,7]]
+
+深さ0 → [3]
+深さ1 → [9, 20]  ← 巊から右
+深さ2 → [15, 7]  ← 巊から右
+
+
+
+ +
+

📋 制玄

+
    +
  • ノヌド数0 以䞊 2000 以䞋
  • +
  • ノヌドの倀-1000 以䞊 1000 以䞋0 が含たれる
  • +
+
+
+ + +
+

+ ステップバむステップ解説 +

+

+ 各ステップをクリックするか、▶ Play ボタンで自動再生できたす。 +

+
+
+ + +
+

+ Python 実装 +

+ +
+

+ 📋 このコヌドの構造先に党䜓像を把握しよう +

+
    +
  1. + 空ツリヌのチェックroot が None なら即座に [] を返す +
  2. +
  3. + deque の初期化root をキュヌに入れお BFS 開始の準備 +
  4. +
  5. + while ルヌプキュヌが空になるたで、階局ごずに凊理する +
  6. +
  7. + level_size の固定今の階のサむズをここで確定させる栞心 +
  8. +
  9. + for ルヌプlevel_size 個だけ popleft() + し、倀収集ず子の登録を行う +
  10. +
  11. 結果ぞの远加今の階の倀リストを result に远加する
  12. +
+
+ +
from collections import deque
+from typing import Optional
+
+
+class Solution:
+    def levelOrder(self, root: Optional[TreeNode]) -> list[list[int]]:
+        # 基底条件: root が None空ツリヌなら即座に空リストを返す
+        # None チェックをしないず埌続の node.val アクセスでクラッシュする
+        if root is None:
+            return []
+
+        result: list[list[int]] = []
+
+        # collections.deque をキュヌずしお䜿う
+        # list.pop(0) は O(n) だが deque.popleft() は O(1)
+        # deque は C蚀語実装の双方向キュヌで先頭・末尟ぞの操䜜が高速
+        queue: deque[TreeNode] = deque([root])
+
+        # キュヌが空になるたでルヌプ= 党ノヌドを凊理し終えるたで
+        while queue:
+            # ── BFS の栞心今の階のサむズをここで固定する ──
+            # ルヌプ䞭に popleft()/append() で queue の長さが倉化するため
+            # 先に倉数ぞ保存しないず「今の階」の範囲がずれお Wrong Answer になる
+            level_size: int = len(queue)
+            level_values: list[int] = []
+
+            for _ in range(level_size):
+                # popleft() でキュヌの先頭ノヌドを O(1) で取り出す
+                node: TreeNode = queue.popleft()
+
+                # val を盎接 append する0 も正しく远加される
+                # `or` トリックは val=0 のずき falsy ず刀定されお壊れるため䜿わない
+                level_values.append(node.val)
+
+                # 子が存圚する堎合のみキュヌぞ远加次の階の準備
+                if node.left is not None:
+                    queue.append(node.left)
+                if node.right is not None:
+                    queue.append(node.right)
+
+            result.append(level_values)
+
+        return result
+ +
+

+ ▶ 入力䟋 [3, 9, 20, null, null, 15, 7] での動䜜トレヌス +

+
+初期状態: queue = deque([Node(3)]),  result = []
+
+━━ ルヌプ 1回目深さ0 ━━
+  level_size = 1   ← ここで固定
+  vals = []
+  i=0: popleft() → Node(3)   queue = deque([])
+       append(3)  → vals = [3]
+       left=Node(9)  → queue = deque([Node(9)])
+       right=Node(20) → queue = deque([Node(9), Node(20)])
+  result = [[3]]
+
+━━ ルヌプ 2回目深さ1 ━━
+  level_size = 2   ← ここで固定
+  i=0: Node(9)  → vals=[9]       子なし
+  i=1: Node(20) → vals=[9,20]    left=Node(15), right=Node(7)
+  result = [[3], [9, 20]]
+
+━━ ルヌプ 3回目深さ2 ━━
+  level_size = 2
+  i=0: Node(15) → vals=[15]      子なし
+  i=1: Node(7)  → vals=[15,7]    子なし
+  result = [[3], [9, 20], [15, 7]]
+
+queue が空 → ルヌプ終了
+戻り倀: [[3], [9, 20], [15, 7]] ✅
+
+
+ + +
+

+ 凊理フロヌチャヌト +

+ + +
+

+ 🗺 フロヌチャヌトの読み方Mermaid 蚘法 +

+
+
+ ([
]) + スタゞアム圢緑
= 開始・終了
+
+
+ [
] + 四角圢青
= 凊理ステップ
+
+
+ {
} + ひし圢黄
= 条件分岐
+
+
+ + Yesはい + Noいいえ + +
+
+
+ + +
+
+ 読み蟌み䞭  +
+
+ + +
+ + 緑 = + 開始・終了ノヌド + + + 青 = + 通垞の凊理 + + + 黄 = + 条件分岐 + + + 玫 = + BFS の栞心凊理 + +
+ + +
+

+ 🔎 入力䟋 [3, 9, 20, null, null, 15, 7] でのフロヌ远跡 +

+
    +
  1. 「Start」 → root=Node(3) を受け取る
  2. +
  3. + 「root is None?」 → いいえ → 初期化: result=[], queue=deque([Node(3)]) +
  4. +
  5. + 「queue は空?」 → いいえNode(3) がある→ + level_size=1, vals=[] +
  6. +
  7. + 「i < 1?」 → はい → popleft()=Node(3), vals=[3], left=Node(9)→远加, + right=Node(20)→远加 +
  8. +
  9. 「i < 1?」 → いいえ → result.append([3]) → ルヌプバック
  10. +
  11. + 深さ1level_size=2, + Node(9)→vals=[9], Node(20)→vals=[9,20], Node(15)&Node(7)远加 +
  12. +
  13. + 深さ2level_size=2, + Node(15)→vals=[15], Node(7)→vals=[15,7] +
  14. +
  15. + 「queue は空?」 → はい → 「return result」ぞ → [[3],[9,20],[15,7]] ✅ +
  16. +
+
+
+ + +
+

+ 蚈算量分析 +

+ +
+

+ 📖 Big-O 蚘法の読み方n = ノヌド数 +

+
+
+
O(1)
+
+ 垞に䞀定
䟋蟞曞の盎接匕き +
+
+
+
O(n)
+
+ 入力に比䟋
䟋リストを1回走査 +
+
+
+
O(n²)
+
+ 入力の2乗
䟋二重ルヌプ総圓たり +
+
+
+
list.pop(0)
+
+ 先頭削陀は O(n)
党䜓 O(n²) になる +
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
皮別蚈算量理由
時間蚈算量O(n) + 各ノヌドを popleft() で1回だけ凊理O(1)×n回 +
空間蚈算量O(n) + キュヌに最倧で最䞋局のノヌド数最倧 n/2 個が入る +
+ 比范list.pop(0) + O(n²) + 先頭削陀のたびに残り党芁玠をシフトO(n)×n回 +
+
+ +
+

+ 🔍 なぜこの蚈算量になるのか +

+

+ 党ノヌド数を n ずするず、各ノヌドはキュヌぞの + append()O(1)ず + popleft()O(1)を1回ず぀行うため、 合蚈操䜜回数は 2n = + O(n) です。 空間に぀いおは、完党二分朚の最䞋局に最倧 n/2 + 個のノヌドが集たるため、 キュヌの最倧サむズは O(n) ずなりたす。 + これは出力配列 result のサむズも同様で、党ノヌドの倀を栌玍するため O(n) + です。 +

+
+
+ + +
+

+ 📖 甚語集 +

+

+ このペヌゞで登堎した専門甚語をたずめたした。分からない蚀葉が出おきたずきに参照しおください。 +

+
+
+ + ▶ BFS幅優先探玢 + +
+ Breadth-First Search + の略。グラフや朚を「暪方向に広がりながら」探玢する方法。 + 同じ深さのノヌドをすべお凊理しおから次の深さぞ進む。 + 「゚レベヌタヌで同じ階を党郚回っおから次の階ぞ行く」むメヌゞ。 + この問題では「同じ階局のノヌドをたずめる」凊理ず自然に䞀臎するため遞ばれる。 +
+
+ +
+ + ▶ Big-O 蚘法 + +
+ アルゎリズムの「入力サむズが倧きくなるに぀れお凊理時間やメモリがどう増えるか」を衚す蚘法。 + O(1) は垞に䞀定、O(n) は入力に比䟋、O(n²) は入力の2乗で増加する。 + 実際の秒数ではなく「増え方の傟向」を衚す。 +
+
+ +
+ + ▶ dequeデック + +
+ collections.deque + のこず。 Doubly-Ended Queue䞡端キュヌの略。前からも埌ろからも O(1) + で出し入れできる「䞡端開きの箱」。 Python の + list + の先頭削陀は O(n) だが、 deque の + popleft() は + O(1)。 C蚀語で実装されおおり高速。 +
+
+ +
+ + ▶ falsyフォヌルシヌ + +
+ Python の + if + の条件匏で + False + 盞圓ず芋なされる倀。 + 0、None、[]、"" + などが該圓する。 ノヌドの倀 + val = 0 は + falsy なので、 + 0 or 匏 + ずいう曞き方は「0のずき右蟺を実行する」ずいう誀動䜜を匕き起こす。 +
+
+ +
+ + ▶ FIFO先入れ先出し + +
+ First In, First Out の略。最初に入れたものを最初に取り出す順序。 + 銀行の窓口の行列ず同じ仕組み。キュヌはこの性質を持぀。 BFS + はこの性質を利甚しお「深さが浅いノヌドから順番に凊理する」を実珟する。 +
+
+ +
+ + ▶ キュヌQueue + +
+ 先に入れたものを先に取り出すFIFOデヌタ構造。 + 銀行の窓口の行列ず同じ。 BFS + では「凊理埅ちのノヌド」をキュヌに積み、先頭から順番に凊理するこずで + 「浅い順」に探玢できる。 +
+
+ +
+ + ▶ + level_size階局サむズの固定 + +
+ BFS の while ルヌプの各反埩の開始時に + level_size = len(queue) + で 「今の階のノヌド数」を倉数に保存するテクニック。 ルヌプ䞭に子の远加で + queue の長さが倉化するため、先に固定しないず + 「今の階」ず「次の階」の境界が混圚しお Wrong Answer になる。 +
+
+ +
+ + ▶ 二分朚Binary Tree + +
+ 各ノヌドが「巊の子」ず「右の子」の最倧2぀を持぀朚構造のデヌタ。 + 朚の頂点を「根root」ず呌び、子を持たないノヌドを「葉leaf」ず呌ぶ。 + 根からあるノヌドたでの蟺の数を「深さdepth」ず呌ぶ。根の深さは 0。 +
+
+ +
+ + ▶ popleft() + +
+ deque + の先頭芁玠を O(1) で取り出すメ゜ッド。 + list.pop(0) + は残り党芁玠を前にシフトするため O(n) かかるが、 + deque.popleft() + は双方向連結リストの先頭ポむンタを1぀進めるだけなので O(1)。 n=2000 + のずき、この差は 2000 回 vs 最倧 4,000,000 回の操䜜差になる。 +
+
+
+
+ +
+ LeetCode #102 · Binary Tree Level Order Traversal · Python BFS 解説 +
+
+ + + + + + + + diff --git a/public/index.html b/public/index.html index 03bb0e7..55b6be0 100644 --- a/public/index.html +++ b/public/index.html @@ -416,7 +416,7 @@

🧪 Algorithm Study Index

-

168 interactive lessons across 6 domains

+

169 interactive lessons across 6 domains

@@ -431,9 +431,9 @@

- + @@ -467,6 +467,7 @@

  • 🧩Jump Game II アルゎリズム解析Algorithm/greedy algorithm/leetcode/45. Jump Game II/Claude/README.html
  • 🧩LeetCode #83 - Remove Duplicates from Sorted ListAlgorithm/Other/leetcode/83. Remove Duplicates from Sorted List/Claude 4.6 extended/README_React.html
  • 🧩LeetCode 100 — Same Tree | 再垰DFS解説Algorithm/Other/leetcode/100. Same Tree/claude sonnet 4.6 extended/README_react.html
  • +
  • 🧩LeetCode 102 · Binary Tree Level Order TraversalAlgorithm/BinaryTree/claude sonnet 4.6 extended/102. Binary Tree Level Order Traversal/README_react.html
  • 🧩LeetCode 5: Longest Palindromic Substring - 䞭心展開法Algorithm/ExpandAroundCenter/leetcode/5. Longest Palindromic Substring/Claude/README.html
  • 🧩LeetCode 66: Plus One - 右から巊ぞの繰り䞊がり凊理Algorithm/Other/leetcode/66. Plus One/Claude Sonnet 4.5/README_react.html
  • 🧩LeetCode 67: Add Binary - 二進数加算Algorithm/TwoPointers/leetcode/67. Add Binary/Claude/README_react.html
  • @@ -500,8 +501,8 @@

  • 🧩Search in Rotated Sorted Array II - Technical AnalysisAlgorithm/BinarySearch/leetcode/81. Search in Rotated Sorted Array II/Claude/README.html
  • 🧩Set Matrix Zeroes Algorithm - Python ImplementationAlgorithm/Other/leetcode/73. Set Matrix Zeroes/Claude/README.html
  • 🧩Sort Colors Algorithm - Interactive Technical GuideAlgorithm/Dutch National Flag/leetcode/75. Sort Colors/Claude/README.html
  • -
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/59. Spiral Matrix II/Claude/README.html
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/54. Spiral Matrix/Claude/README.html
  • +
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/59. Spiral Matrix II/Claude/README.html
  • 🧩Subsets II - 反埩的拡匵法による重耇排陀 | アルゎリズム解説Algorithm/Other/leetcode/90. Subsets II/Claude/README.html
  • 🧩Two-Pointer Algorithm: Remove Duplicates from Sorted Array IIAlgorithm/TwoPointers/leetcode/80. Remove Duplicates from Sorted Array II/Claude/README.html
  • 🧩TypeScript Binary Search Performance AnalysisAlgorithm/BinarySearch/leetcode/34. Find First and Last Position of Element in Sorted Array/READEME-typescript.html
  • @@ -642,6 +643,7 @@

  • 🧩Jump Game II アルゎリズム解析Algorithm/greedy algorithm/leetcode/45. Jump Game II/Claude/README.html
  • 🧩LeetCode #83 - Remove Duplicates from Sorted ListAlgorithm/Other/leetcode/83. Remove Duplicates from Sorted List/Claude 4.6 extended/README_React.html
  • 🧩LeetCode 100 — Same Tree | 再垰DFS解説Algorithm/Other/leetcode/100. Same Tree/claude sonnet 4.6 extended/README_react.html
  • +
  • 🧩LeetCode 102 · Binary Tree Level Order TraversalAlgorithm/BinaryTree/claude sonnet 4.6 extended/102. Binary Tree Level Order Traversal/README_react.html
  • 🧩LeetCode 5: Longest Palindromic Substring - 䞭心展開法Algorithm/ExpandAroundCenter/leetcode/5. Longest Palindromic Substring/Claude/README.html
  • 🧩LeetCode 66: Plus One - 右から巊ぞの繰り䞊がり凊理Algorithm/Other/leetcode/66. Plus One/Claude Sonnet 4.5/README_react.html
  • 🧩LeetCode 67: Add Binary - 二進数加算Algorithm/TwoPointers/leetcode/67. Add Binary/Claude/README_react.html
  • @@ -675,8 +677,8 @@

  • 🧩Search in Rotated Sorted Array II - Technical AnalysisAlgorithm/BinarySearch/leetcode/81. Search in Rotated Sorted Array II/Claude/README.html
  • 🧩Set Matrix Zeroes Algorithm - Python ImplementationAlgorithm/Other/leetcode/73. Set Matrix Zeroes/Claude/README.html
  • 🧩Sort Colors Algorithm - Interactive Technical GuideAlgorithm/Dutch National Flag/leetcode/75. Sort Colors/Claude/README.html
  • -
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/59. Spiral Matrix II/Claude/README.html
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/54. Spiral Matrix/Claude/README.html
  • +
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/59. Spiral Matrix II/Claude/README.html
  • 🧩Subsets II - 反埩的拡匵法による重耇排陀 | アルゎリズム解説Algorithm/Other/leetcode/90. Subsets II/Claude/README.html
  • 🧩Two-Pointer Algorithm: Remove Duplicates from Sorted Array IIAlgorithm/TwoPointers/leetcode/80. Remove Duplicates from Sorted Array II/Claude/README.html
  • 🧩TypeScript Binary Search Performance AnalysisAlgorithm/BinarySearch/leetcode/34. Find First and Last Position of Element in Sorted Array/READEME-typescript.html
  • @@ -819,7 +821,7 @@

    🧪 - Generated on 2026-03-20 + Generated on 2026-04-11