<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>データ構造 on 怠惰技術ブログ</title>
    <link>/tags/%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0/</link>
    <description>Recent content in データ構造 on 怠惰技術ブログ</description>
    <generator>Hugo -- 0.147.7</generator>
    <language>ja</language>
    <lastBuildDate>Fri, 09 Jan 2026 06:30:00 +0900</lastBuildDate>
    <atom:link href="/tags/%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>DFS/BFSの本質：深さと幅を支配するデータ構造の選択</title>
      <link>/posts/2026-01-09-dfs-bfs/</link>
      <pubDate>Fri, 09 Jan 2026 06:30:00 +0900</pubDate>
      <guid>/posts/2026-01-09-dfs-bfs/</guid>
      <description>&lt;p&gt;DFS, BFSがわかりづらかったので、いくつかの記事を見て個人的に感じた疑問や
「こういうコード例が欲しい」という要望を踏まえて生成AIに生成してもらった。&lt;/p&gt;
&lt;p&gt;生成された内容を検証し、コードを実際に動かして確認したところ、
自分の理解が深まる良い記事になったので、このまま公開することにした。&lt;/p&gt;
&lt;h2 id=&#34;はじめに&#34;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;LeetCodeでMedium問題を解いていると、必ず遭遇するのがDFS（深さ優先探索）とBFS（幅優先探索）だ。&lt;/p&gt;
&lt;p&gt;「Dは深さ、Bは幅」というのは知っている。でも、&lt;strong&gt;なぜスタックとキューを使い分けるのか&lt;/strong&gt;？その本質を理解している人は意外と少ない。&lt;/p&gt;
&lt;p&gt;今回は、入れ子リストの例を使って、DFS/BFSの動作原理とデータ構造の関係を視覚的に解説する。&lt;/p&gt;
&lt;h2 id=&#34;問題設定入れ子リストをフラット化する&#34;&gt;問題設定：入れ子リストをフラット化する&lt;/h2&gt;
&lt;p&gt;以下のような入れ子構造のリストがあるとする。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;data &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, [&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;, [&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;], &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;], &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これをフラットな配列にしたい。このとき、「どの順番で要素を取り出すか」がDFS/BFSの違いだ。&lt;/p&gt;
&lt;h2 id=&#34;ツリー構造として可視化する&#34;&gt;ツリー構造として可視化する&lt;/h2&gt;
&lt;p&gt;入れ子リストは、実はツリー構造として表現できる。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;        root
       / | \
      1  []  3
         |
        /|\ \
       4 5 [] 2
           |
          /|\
         6 7 8
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この木をどう巡回するかで、DFSとBFSが決まる。&lt;/p&gt;
&lt;h2 id=&#34;dfs深さ優先探索とにかく深く潜る&#34;&gt;DFS（深さ優先探索）：とにかく深く潜る&lt;/h2&gt;
&lt;h3 id=&#34;動作イメージ&#34;&gt;動作イメージ&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;「見つけた枝があれば、まずそこを最後まで探索する」&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;訪問順序：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1 → [中に入る] → 4 → 5 → [さらに中] → 6 → 7 → 8 
→ [戻る] → 2 → [戻る] → 3
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;結果：&lt;code&gt;[1, 4, 5, 6, 7, 8, 2, 3]&lt;/code&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
