Skip to content

Commit 18290ec

Browse files
committed
docs(Trees): finalize Symmetric Tree refinements and fix animation logic
1 parent c1db98c commit 18290ec

4 files changed

Lines changed: 19 additions & 11 deletions

File tree

DataStructures/Trees/Other/101. Symmetric Tree/claude sonnet 4.6 extended/README_react.html

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1320,7 +1320,7 @@ <h1 class="outfit text-[2.4rem] font-extrabold text-teal-900 mb-1 leading-tight"
13201320
class="text-slate-600 text-xs space-y-1 list-disc list-inside leading-6"
13211321
>
13221322
<li>コードの読みやすさを優先したい</li>
1323-
<li>ノード数が1000以内(デフォルトスタック上限内</li>
1323+
<li>バランスの取れた木(深さがスタック上限に達しない</li>
13241324
<li>「鏡写しの定義」をそのままコードに落としたい</li>
13251325
</ul>
13261326
</div>
@@ -1329,7 +1329,7 @@ <h1 class="outfit text-[2.4rem] font-extrabold text-teal-900 mb-1 leading-tight"
13291329
<ul
13301330
class="text-slate-600 text-xs space-y-1 list-disc list-inside leading-6"
13311331
>
1332-
<li>深い木(深さ &gt; 1000)で RecursionError が心配</li>
1332+
<li>深さが約1000前後になる退化した木(深さ ≈ スタック上限)では再帰が危険になるため反復版を検討する</li>
13331333
<li>スタックオーバーフローを完全に回避したい</li>
13341334
<li>本番環境など安全性を最優先にしたい</li>
13351335
</ul>
@@ -1864,7 +1864,6 @@ <h1 class="outfit text-[2.4rem] font-extrabold text-teal-900 mb-1 leading-tight"
18641864
if (isPlaying) {
18651865
timerRef.current = setTimeout(() => {
18661866
if (activeStep === stepsData.length) {
1867-
setActiveStep(1);
18681867
setIsPlaying(false);
18691868
} else {
18701869
setActiveStep((prev) => prev + 1);
@@ -1876,7 +1875,12 @@ <h1 class="outfit text-[2.4rem] font-extrabold text-teal-900 mb-1 leading-tight"
18761875
};
18771876
}, [isPlaying, activeStep]);
18781877

1879-
const handlePlay = () => setIsPlaying(true);
1878+
const handlePlay = () => {
1879+
if (activeStep === stepsData.length) {
1880+
setActiveStep(1);
1881+
}
1882+
setIsPlaying(true);
1883+
};
18801884

18811885
return (
18821886
<div className="grid grid-cols-1 md:grid-cols-[1fr_2fr] gap-8 mt-2">

DataStructures/Trees/Other/101. Symmetric Tree/claude sonnet 4.6 extended/Symmetric_Tree_Python.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
### 競技プログラミング視点
3636

3737
- **制約分析**:ノード数1〜1000と小さいため、全ノードを1回訪問する O(n) で十分
38-
- **最速手法**:再帰DFS。Pythonの関数呼び出しコストはあるが、ノード数1000では問題なし
38+
- **最速手法**:再帰DFS。再帰は可読性が高いですが、退化した木(最悪ケース)では再帰深度がPythonの再帰制限(デフォルト1000)に近づく可能性があるため、安全性を重視するなら反復版を推奨します
3939
- **CPython最適化**`and` の短絡評価(=左辺がFalseなら右辺を評価しない仕組み)で無駄な再帰を早期カット
4040

4141
### 業務開発視点

DataStructures/Trees/Other/101. Symmetric Tree/claude sonnet 4.6 extended/Symmetric_Tree_TypeScript.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@
9696
- **選択したアプローチ**: **A(再帰)をメイン、B(反復)をフォローアップ** として両方実装
9797
- **理由**
9898
- **方法C(シリアライズ)は選ばない**:実装コストが高く、null位置のエンコードが複雑になるため
99-
- **方法A(再帰)を選ぶ**:「鏡写しの定義」がそのままコードになる直感的な構造。ノード数1000以下なのでスタックオーバーフローの心配なし(Nodeのデフォルトスタック深度は通常10,000以上)
99+
- **方法A(再帰)を選ぶ**:「鏡写しの定義」がそのままコードになる直感的な構造。再帰は可読性が高いですが、非常に深い木(退化した木)ではコールスタックの上限に達するリスクがあります。そのため、極端な深さや異なる実行環境(ブラウザ/LeetCode/Node等)での安全性を考慮し、反復版(方法B)も代替案として用意します。
100100
- **方法B(反復)もフォローアップで実装**:深さが極端に大きいケースへの対応として有用
101101

102102
- **TypeScript特有の最適化ポイント**
@@ -338,7 +338,7 @@ function isSymmetric(root: TreeNode | null): boolean {
338338

339339
### コンパイル時最適化
340340

341-
1. **型推論の活用**`queue.shift()` の戻り値型は `[TreeNode|null, TreeNode|null] | undefined` とTypeScriptが自動推論するため、明示的な型注釈が不要
341+
1. **インデックスによるキュー操作の最適化**`queue.shift()` による O(n) の配列再インデックスを避けるため、`head` インデックスを使用しています。`queue[head]` で要素を参照し、`head++` でポインタを進めることで、キューからの取り出しを O(1) で実現し、大量のノードがある場合でも高いパフォーマンスを維持できます。
342342
2. **readonly修飾子**:今回はLeetCodeの既存クラス定義を使うため追加はしないが、自前のデータ構造では `readonly` を付けてイミュータブルにするのが理想
343343

344344
### 計算量まとめ

public/DataStructures/Trees/Other/101. Symmetric Tree/claude sonnet 4.6 extended/README_react.html

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1320,7 +1320,7 @@ <h1 class="outfit text-[2.4rem] font-extrabold text-teal-900 mb-1 leading-tight"
13201320
class="text-slate-600 text-xs space-y-1 list-disc list-inside leading-6"
13211321
>
13221322
<li>コードの読みやすさを優先したい</li>
1323-
<li>ノード数が1000以内(デフォルトスタック上限内</li>
1323+
<li>バランスの取れた木(深さがスタック上限に達しない</li>
13241324
<li>「鏡写しの定義」をそのままコードに落としたい</li>
13251325
</ul>
13261326
</div>
@@ -1329,7 +1329,7 @@ <h1 class="outfit text-[2.4rem] font-extrabold text-teal-900 mb-1 leading-tight"
13291329
<ul
13301330
class="text-slate-600 text-xs space-y-1 list-disc list-inside leading-6"
13311331
>
1332-
<li>深い木(深さ &gt; 1000)で RecursionError が心配</li>
1332+
<li>深さが約1000前後になる退化した木(深さ ≈ スタック上限)では再帰が危険になるため反復版を検討する</li>
13331333
<li>スタックオーバーフローを完全に回避したい</li>
13341334
<li>本番環境など安全性を最優先にしたい</li>
13351335
</ul>
@@ -1864,7 +1864,6 @@ <h1 class="outfit text-[2.4rem] font-extrabold text-teal-900 mb-1 leading-tight"
18641864
if (isPlaying) {
18651865
timerRef.current = setTimeout(() => {
18661866
if (activeStep === stepsData.length) {
1867-
setActiveStep(1);
18681867
setIsPlaying(false);
18691868
} else {
18701869
setActiveStep((prev) => prev + 1);
@@ -1876,7 +1875,12 @@ <h1 class="outfit text-[2.4rem] font-extrabold text-teal-900 mb-1 leading-tight"
18761875
};
18771876
}, [isPlaying, activeStep]);
18781877

1879-
const handlePlay = () => setIsPlaying(true);
1878+
const handlePlay = () => {
1879+
if (activeStep === stepsData.length) {
1880+
setActiveStep(1);
1881+
}
1882+
setIsPlaying(true);
1883+
};
18801884

18811885
return (
18821886
<div className="grid grid-cols-1 md:grid-cols-[1fr_2fr] gap-8 mt-2">

0 commit comments

Comments
 (0)