Dərinlik üzrə axtarış (DFS) qrafı labirint kimi gəzir: bir yolla mümkün qədər dərinə gedir, çıxılmaz yerdə geri qayıdıb növbətini yoxlayır. Ona iki şey lazımdır: ziyarət edilmiş təpələr çoxluğu (yoxsa dövrləri olan qrafda sonsuz dövr edər) və hara qayıtmağı yadda saxlayan stek. Qraflar Qrafların təsviri mövzusundakı kimi saxlanır; nümunələrdə qonşuluq siyahılarından ibarət lüğət işlədilir.

A-dan DFS izi: ziyarət sırası A B D E F C, ağac tilləri və bir geri til
A-dan DFS izi: ziyarət sırası A B D E F C, ağac tilləri və bir geri til

Rekursiv DFS

visit(u) təpəni işarələyir, sonra hələ ziyarət edilməmiş hər qonşu üçün özünü çağırır. Qonşuların sırası ziyarət sırasını təyin edir.

python
graph = {
    "A": ["B", "C"],
    "B": ["A", "D", "E"],
    "C": ["A", "F"],
    "D": ["B"],
    "E": ["B", "F"],
    "F": ["C", "E"],
}

def dfs(graph, start):
    visited = set()
    order = []

    def visit(u):
        visited.add(u)                    # mark on entry
        order.append(u)
        for v in graph[u]:
            if v not in visited:
                visit(v)

    visit(start)
    return order

print(dfs(graph, "A"))
text
['A', 'B', 'D', 'E', 'F', 'C']

Burada D çıxılmazdır: DFS B-yə qayıdıb E ilə davam edir. A-C tili işlədilmir: DFS F-dən C-yə çatanda A artıq ziyarət edilib (geri til). Qalın tillər DFS ağacını təşkil edir.

Stek ilə iterativ DFS

Rekursiya stekini öz stekimizlə əvəz etmək olar: pop ən son əlavə olunan təpəni götürür (LIFO). Qonşuları reversed ilə əlavə etsək, ziyarət sırası rekursiyadakı ilə eyni olur.

python
graph = {
    "A": ["B", "C"],
    "B": ["A", "D", "E"],
    "C": ["A", "F"],
    "D": ["B"],
    "E": ["B", "F"],
    "F": ["C", "E"],
}