Menu
Coddy logo textTech

Binärbaum

Zuletzt aktualisiert

Ein Binärbaum ist eine Hierarchie, in der jeder Knoten höchstens zwei Kinder hat, das linke und das rechte Kind. Der oberste Knoten ist die Wurzel, Knoten ohne Kinder sind Blätter, und die Anzahl der Kanten von der Wurzel bis zum tiefsten Blatt ist die Höhe des Baums. Anders als ein binärer Suchbaum hat ein einfacher Binärbaum keine Ordnungsregel – es geht nur um die Form. Drücke oben auf Play, um zu sehen, wie sich ein Baum Ebene für Ebene füllt und dann in-order (links, Knoten, rechts) durchlaufen wird.

Binärbäume bilden die Grundlage vieler Strukturen – binäre Suchbäume, Heaps, Ausdrucksbäume und mehr. Traversierungen besuchen jeden Knoten in einer definierten Reihenfolge: In-Order, Pre-Order und Post-Order sind die drei Tiefensuch-Durchläufe, jeder nützlich für andere Aufgaben.

Terminologie

BegriffBedeutung
WurzelDer oberste Knoten, ohne Elternknoten
BlattEin Knoten ohne Kinder
HöheLängster Wurzel-zu-Blatt-Pfad (in Kanten)
TiefeAbstand eines Knotens von der Wurzel
VollständigAlle Ebenen voll bis auf ggf. die letzte, die von links nach rechts gefüllt wird

Die drei Tiefensuch-Traversierungen

TraversierungReihenfolgeTypische Verwendung
In-OrderLinks, Knoten, rechtsSortierte Ausgabe eines BST
Pre-OrderKnoten, links, rechtsBaum kopieren / serialisieren
Post-OrderLinks, rechts, KnotenBaum löschen / auswerten

Durchgerechnetes Beispiel

In-Order-Traversierung des aus [4, 2, 6, 1, 3, 5] (Ebene für Ebene gefüllten) Baums:

SchrittAm KnotenAktion
14Rekursion in den linken Teilbaum von 4, bevor er besucht wird
22Rekursion in den linken Teilbaum von 2, bevor er besucht wird
31Blatt, kein linkes Kind: besuche 1, Ausgabe [1]
42Links fertig: besuche 2, Ausgabe [1, 2], dann Rekursion nach rechts
53Blatt: besuche 3, Ausgabe [1, 2, 3]
64Linker Teilbaum fertig: besuche 4, Ausgabe [1, 2, 3, 4], dann Rekursion nach rechts
75Linkes Kind von 6, ein Blatt: besuche 5, Ausgabe [1, 2, 3, 4, 5]
86Links fertig, kein rechtes Kind: besuche 6, Ausgabe [1, 2, 3, 4, 5, 6]

Wann man einen Binärbaum verwendet

Verwenden, wennVermeiden, wenn
Du inhärent hierarchische Daten modellieren musst (Dateisysteme, Ausdrucksbäume, DOM)Die Daten flach sind und eine Liste oder ein Array genügen würde – ein Baum bringt nur Overhead
Du geordnete Operationen willst und ihn ausbalanciert halten kannst (ein BST oder selbstbalancierender Baum)Du eine Schlüsselsuche im Durchschnitt in O(1) brauchst – eine Hash-Tabelle schlägt jeden Baum
Du strukturierte Daten in In-Order, Pre-Order oder Post-Order verarbeiten musstKnoten in sortierter Reihenfolge in einen unbalancierten BST eingefügt werden – er degeneriert zu einer O(n)-Liste
Bereichsabfragen oder geordnete Iteration wichtig sind, was Hash-Tabellen nicht bietenDer Speicher knapp ist – jeder Knoten trägt zwei Kindzeiger zusätzlich zur Nutzlast

Binary Tree-Code

Eine saubere, lauffähige Binary Tree-Implementierung in Python, JavaScript, Java, C++, C. Wähle eine Sprache, kopiere den Code oder öffne ihn vorgeladen im Coddy-Playground.

Binary Tree-Code in Python

Python
1from collections import deque2
3
4class Node:5    def __init__(self, value):6        self.value = value7        self.left = None8        self.right = None9
10
11def insert(root, value):12    # Level-order insert: fill the first empty child slot found13    if root is None:14        return Node(value)15    queue = deque([root])16    while queue:17        node = queue.popleft()18        if node.left is None:19            node.left = Node(value)20            return root21        queue.append(node.left)22        if node.right is None:23            node.right = Node(value)24            return root25        queue.append(node.right)26
27
28def inorder(node):29    if node is None:30        return []31    return inorder(node.left) + [node.value] + inorder(node.right)32
33
34root = None35for value in [1, 2, 3, 4, 5, 6, 7]:36    root = insert(root, value)37
38print("Root:   ", root.value)39print("Inorder:", inorder(root))
Führe diesen Code im Python-Playground aus

Binärbaum-FAQ

Was ist der Unterschied zwischen einem Binärbaum und einem binären Suchbaum?
Ein Binärbaum beschränkt jeden Knoten lediglich auf höchstens zwei Kinder, ohne jede Ordnung. Ein binärer Suchbaum fügt die Regel hinzu, dass alles im linken Teilbaum kleiner und alles im rechten Teilbaum größer ist, was das Suchen schnell macht.
Was ist eine In-Order-Traversierung?
Die In-Order-Traversierung besucht rekursiv zuerst den linken Teilbaum, dann den Knoten und dann den rechten Teilbaum. Für einen binären Suchbaum ergibt das die Werte in aufsteigend sortierter Reihenfolge, weshalb sie die am häufigsten gezeigte Traversierung ist.
Was ist ein vollständiger Binärbaum?
Ein vollständiger Binärbaum hat alle Ebenen vollständig gefüllt bis auf ggf. die letzte, die von links nach rechts gefüllt wird. Diese Form erlaubt es, den Baum kompakt in einem Array zu speichern (ohne Kindzeiger), so wie binäre Heaps implementiert werden.
Wann sollte ich einen Binärbaum statt eines Arrays oder einer Hash-Tabelle verwenden?
Greife zu einem Baum, wenn deine Daten von Natur aus hierarchisch sind oder wenn du geordnete Operationen wie Bereichsabfragen und sortierte Iteration brauchst, was Hash-Tabellen nicht bieten. Wenn du nur schnelle Schlüsselsuche ohne Ordnung brauchst, schlägt der durchschnittliche O(1)-Zugriff einer Hash-Tabelle einen Baum, und für flache Daten ist ein Array einfacher und cache-freundlicher.
Was ist der Unterschied zwischen der Höhe und der Tiefe eines Binärbaums?
Die Tiefe wird von der Wurzel nach unten bis zu einem bestimmten Knoten gemessen: die Anzahl der Kanten auf dem Pfad von der Wurzel zu diesem Knoten. Die Höhe wird von einem Knoten nach unten bis zu seinem tiefsten Blatt gemessen, sodass die Höhe des gesamten Baums die Tiefe seines tiefsten Knotens ist. Ein Baum mit einem einzigen Knoten hat die Höhe 0, und sein einziger Knoten hat ebenfalls die Tiefe 0.
Warum ist ein unbalancierter Binärbaum so leistungsschwach?
Suchen, Einfügen und Löschen in einem binären Suchbaum kosten O(h), wobei h die Höhe ist. Werden Schlüssel in sortierter Reihenfolge eingefügt, wird der Baum zu einer geraden Linie, sodass h bis auf n wächst und jede Operation zu O(n) degeneriert – nicht besser als eine verkettete Liste. Selbstbalancierende Bäume wie AVL- oder Rot-Schwarz-Bäume halten die Höhe bei O(log n), um das zu verhindern.
Coddy programming languages illustration

Meistere Algorithmen mit Coddy

LOS GEHT'S