2.DFS.md

DFS,即深度優先搜尋,是一種從起點出發,盡可能深入節點後才回退的搜尋策略。它適合用來探索所有可能的路徑、驗證某條路徑是否存在,或是進行拓樸排序與子結構搜尋等任務。


一、DFS 的核心概念

  • 從根節點開始,優先走到底,再回頭探索其他分支

  • 採用「遞迴」或「堆疊」記錄搜尋路徑

  • 常見於圖與樹的遍歷或完全搜索任務


二、節點結構設計(以樹為例)

class TreeNode:
    def __init__(self, value):
        self.value = value
        self.children = []  # 支援多叉樹

三、DFS 搜尋實作(傳回路徑)

def dfs(node, goal_value, path=None):
    if path is None:
        path = []

    path.append(node)
    print(f"Visiting node: {node.value}")

    if node.value == goal_value:
        return path

    for child in node.children:
        result = dfs(child, goal_value, path[:])
        if result:
            return result

    return None

四、完整範例:樹上的 DFS

# 建立樹節點
a = TreeNode("A")
b = TreeNode("B")
c = TreeNode("C")
d = TreeNode("D")
e = TreeNode("E")

# 建立層級關係
a.children = [b, c]
b.children = [d, e]

# 搜尋節點 "E"
path = dfs(a, "E")
if path:
    print("Path found:", " → ".join([node.value for node in path]))
else:
    print("Goal not found")

可能輸出結果:

Visiting node: A
Visiting node: B
Visiting node: D
Visiting node: E
Path found: A → B → E

五、DFS 特性與適用情境

特性
說明

搜尋策略

儘可能深入節點,無解時才回退

適用資料結構

樹(Tree)、圖(Graph)

典型應用場景

遞迴處理、邊界追蹤、迷宮尋路、組合問題、結構遍歷

實作資料結構

可用遞迴(系統堆疊)或自行管理 Stack 結構

記憶體使用量

與樹的深度成正比,適合層數深但每層節點不多的資料結構


DFS 提供一種靈活的探索方式,能夠快速深入結構底層並適用於路徑驗證、結構分析與邏輯推演。搭配剪枝或狀態紀錄可用於許多 AI、演算法競賽與遞迴型問題中。

Last updated