Skip to content

Graphen und Bäume

Graphen und Bäume sind fundamentale Datenstrukturen, die wir für Suchalgorithmen wie BFS und DFS benötigen.

Grundlagen

Knoten (Nodes/Vertices)

Ein Knoten ist ein Element im Graph. In Suchproblemen repräsentiert ein Knoten einen Zustand.

Beispiel: In einem Labyrinth ist jeder Knoten eine Position (x, y).

Kanten (Edges)

Eine Kante verbindet zwei Knoten und repräsentiert eine Aktion oder einen Übergang zwischen Zuständen.

Beispiel: In einem Labyrinth verbindet eine Kante zwei benachbarte Positionen, wenn man von einer zur anderen gehen kann.

A --- B
|     |
C --- D

Hier sind A, B, C, D Knoten und die Linien sind Kanten.

Bäume

Ein Baum ist ein spezieller Graph mit folgenden Eigenschaften:

  • Azyklisch: Es gibt keine Zyklen (keine geschlossenen Pfade)
  • Zusammenhängend: Alle Knoten sind durch Pfade verbunden
  • Genau ein Wurzelknoten: Ein Knoten ohne Eltern
  • Jeder andere Knoten hat genau einen Elternknoten

Kinder (Children)

In einem Baum hat jeder Knoten (außer den Blättern) Kinder - das sind die Knoten, die direkt unter ihm liegen.

    A (Wurzel)
   / \
  B   C
 / \
D   E

Hier ist:

  • A ist die Wurzel
  • B und C sind Kinder von A
  • D und E sind Kinder von B
  • D und E sind Blätter (haben keine Kinder)

Baum traversieren

Traversieren bedeutet, alle Knoten eines Baumes systematisch zu besuchen. Es gibt verschiedene Strategien:

  • Breitensuche (BFS): Besuche zuerst alle Knoten auf einer Ebene, dann die nächste Ebene
  • Tiefensuche (DFS): Gehe so tief wie möglich in einen Zweig, bevor du zurückgehst

Zyklisch vs. Azyklisch

Azyklisch

Ein Graph ist azyklisch, wenn es keine geschlossenen Pfade gibt. Du kannst nicht von einem Knoten ausgehen und wieder zu ihm zurückkommen.

A → B → C

     D

Dieser Graph ist azyklisch.

Zyklisch

Ein Graph ist zyklisch, wenn es geschlossene Pfade gibt.

A → B → C
↑       ↓
D ← E ← F

Hier gibt es Zyklen (z.B. A → B → C → F → E → D → A).

Wichtig für Suche: Bei zyklischen Graphen müssen wir verfolgen, welche Knoten wir bereits besucht haben, um Endlosschleifen zu vermeiden.

Gewichtet vs. Ungewichtet

Ungewichtet

In einem ungewichteten Graph haben alle Kanten die gleiche "Kosten" oder "Distanz".

A --- B --- C

Jede Kante zählt gleich (z.B. 1 Schritt).

Gewichtet

In einem gewichteten Graph haben Kanten unterschiedliche Kosten.

A --5-- B --3-- C

Die Kante A→B kostet 5, die Kante B→C kostet 3.

Beispiel: In einem Straßennetz könnten die Gewichte die Entfernung oder Fahrzeit zwischen Städten sein.

Zielzustand

Ein Zielzustand ist der Zustand, den wir erreichen wollen. Im Graph ist das ein spezieller Knoten.

Beispiel: In einem Labyrinth ist der Zielzustand die Position des Ausgangs.

Bei Suchalgorithmen prüfen wir bei jedem besuchten Knoten, ob es der Zielzustand ist.

Graph-Darstellung im Code

Adjazenzliste

Eine Adjazenzliste speichert für jeden Knoten eine Liste seiner Nachbarn:

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

Für Labyrinth (2D-Gitter)

Bei einem Labyrinth können wir Nachbarn dynamisch berechnen:

python
def hole_nachbarn(labyrinth, x, y):
    """Gibt alle passierbaren Nachbarn einer Position zurück"""
    nachbarn = []
    richtungen = [(0, 1), (0, -1), (1, 0), (-1, 0)]  # rechts, links, unten, oben
    
    for dx, dy in richtungen:
        nx, ny = x + dx, y + dy
        if ist_passierbar(labyrinth, nx, ny):
            nachbarn.append((nx, ny))
    
    return nachbarn

Zusammenfassung für BFS/DFS

Um BFS und DFS zu verstehen und anzuwenden, brauchst du:

  1. Knoten verstehen: Jeder Knoten = ein Zustand
  2. Kanten verstehen: Jede Kante = eine mögliche Aktion
  3. Kinder finden: Von einem Knoten zu seinen Nachbarn gehen
  4. Zyklische Graphen erkennen: Besuchte Knoten markieren, um Endlosschleifen zu vermeiden
  5. Zielzustand prüfen: Bei jedem besuchten Knoten prüfen, ob es das Ziel ist
  6. Gewichtete vs. ungewichtete: Für BFS/DFS zunächst ungewichtet (alle Schritte zählen gleich)

Mit diesem Wissen kannst du BFS und DFS auf jedem Graph oder Baum anwenden!

Informatik & ICT Unterricht Neufeld