Binärer Suchbaum (BST)

Datenstrukturen und Algorithmen in Python

Miriam Antona

Software engineer

Definition

  • Linker Teilbaum eines Knotens:
    • Werte kleiner als der Knoten selbst
  • Rechter Teilbaum eines Knotens:
    • Werte größer als der Knoten selbst
  • Linker und rechter Teilbaum müssen binäre Suchbäume sein

Schematische Darstellung eines binären Suchbaums.

Datenstrukturen und Algorithmen in Python

Implementierung

class TreeNode:  
  def __init__(self, data, left=None, right=None):
    self.data = data
    self.left_child = left
    self.right_child = right
class BinarySearchTree:
  def __init__(self):
    self.root = None
Datenstrukturen und Algorithmen in Python

Suche

  • Suche nach 72

Schematische Darstellung eines binären Suchbaums.

Datenstrukturen und Algorithmen in Python

Suche

  • Suche nach 72

Schematische Darstellung eines binären Suchbaums, bei dem der Wurzelknoten gelb markiert ist.

Datenstrukturen und Algorithmen in Python

Suche

  • Suche nach 72

Schematische Darstellung eines binären Suchbaums, bei dem die Wurzel und ihr linker Teilbaum grau markiert sind. Der erste Knoten des rechten Teilbaums ist gelb markiert.

Datenstrukturen und Algorithmen in Python

Suche

  • Suche nach 72

Schematische Darstellung eines binären Suchbaums. Der linke Teilbaum des letzten Wurzelknotens und der letzte Wurzelknoten sind grau markiert. Der neue Wurzelknoten ist gelb markiert.

Datenstrukturen und Algorithmen in Python

Suche

  • Suche nach 72

Schematische Darstellung eines binären Suchbaums, bei dem der neue Wurzelknoten gelb und die übrigen Knoten grau markiert sind.

Datenstrukturen und Algorithmen in Python

Suche

  • Suche nach 72

Schematische Darstellung eines binären Suchbaums, bei dem der neue Wurzelknoten gelb und die übrigen Knoten grau markiert sind. Der markierte Knoten hat die Zahl 72.

Datenstrukturen und Algorithmen in Python

Suche

def search(self, search_value):

current_node = self.root
while current_node:
if search_value == current_node.data:
return True
elif search_value < current_node.data:
current_node = current_node.left_child
else:
current_node = current_node.right_child
return False
Datenstrukturen und Algorithmen in Python

Einfügen

def insert(self, data):

new_node = TreeNode(data)
if self.root == None:

Grafische Darstellung eines neuen Knotens.

Datenstrukturen und Algorithmen in Python

Einfügen

def insert(self, data):
  new_node = TreeNode(data)
  if self.root == None:
    self.root = new_node
    return











Grafische Darstellung des neuen Knotens, der zum Wurzelknoten geworden ist.

Datenstrukturen und Algorithmen in Python

Einfügen

def insert(self, data):
  new_node = TreeNode(data)
  if self.root == None:
    self.root = new_node
    return
  else:










Grafische Darstellung eines neuen Knotens und eines Wurzelknotens mit rechtem Kind.

Datenstrukturen und Algorithmen in Python

Einfügen

def insert(self, data):
  new_node = TreeNode(data)
  if self.root == None:
    self.root = new_node
    return
  else:
    current_node = self.root

while True:
if data < current_node.data:
if current_node.left_child == None:

Grafische Darstellung eines neuen Knotens und eines Wurzelknotens mit rechtem Kind. Der Wurzelknoten ist current_node.

Datenstrukturen und Algorithmen in Python

Einfügen

def insert(self, data):
  new_node = TreeNode(data)
  if self.root == None:
    self.root = new_node
    return
  else:
    current_node = self.root
    while True:
      if data < current_node.data:
        if current_node.left_child == None:
          current_node.left_child = new_node
          return








Grafische Darstellung eines Wurzelknotens mit rechtem und linkem Kind. Der Wurzelknoten ist current_node. Der neue Knoten ist das linke Kind.

Datenstrukturen und Algorithmen in Python

Einfügen

def insert(self, data):
  new_node = TreeNode(data)
  if self.root == None:
    self.root = new_node
    return
  else:
    current_node = self.root
    while True:
      if data < current_node.data:
        if current_node.left_child == None: 
          current_node.left_child = new_node
          return
        else:







Grafische Darstellung eines neuen Knotens und eines Binärsuchbaums mit einigen Elementen. Der Wurzelknoten ist current_node.

Datenstrukturen und Algorithmen in Python

Einfügen

def insert(self, data):
  new_node = TreeNode(data)
  if self.root == None:
    self.root = new_node
    return
  else:
    current_node = self.root
    while True:
      if data < current_node.data:
        if current_node.left_child == None: 
          current_node.left_child = new_node
          return
        else:
          current_node = current_node.left_child           

Grafische Darstellung eines neuen Knotens und eines Binärsuchbaums mit einigen Elementen. current_node ist das linke Kind der Wurzel.

Datenstrukturen und Algorithmen in Python

Einfügen

def insert(self, data):
  new_node = TreeNode(data)
  if self.root == None:
    self.root = new_node
    return
  else:
    current_node = self.root
    while True:
      if data < current_node.data:
        if current_node.left_child == None:
          current_node.left_child = new_node
          return
        else:
          current_node = current_node.left_child
      elif data > current_node.data:

if current_node.right_child == None:

Grafische Darstellung eines neuen Knotens und eines Binärsuchbaums mit linkem Teilbaum.

Datenstrukturen und Algorithmen in Python

Einfügen

def insert(self, data):
  new_node = TreeNode(data)
  if self.root == None:
    self.root = new_node
    return
  else:
    current_node = self.root
    while True:
      if data < current_node.data:
        if current_node.left_child == None:
          current_node.left_child = new_node
          return
        else:
          current_node = current_node.left_child
      elif data > current_node.data:
        if current_node.right_child == None:
          current_node.right_child = new_node
          return


Grafische Darstellung eines Binärsuchbaums mit linkem Teilbaum. Der neue Knoten ist jetzt das rechte Kind der Wurzel.

Datenstrukturen und Algorithmen in Python

Einfügen

def insert(self, data):
  new_node = TreeNode(data)
  if self.root == None:
    self.root = new_node
    return
  else:
    current_node = self.root
    while True:
      if data < current_node.data:
        if current_node.left_child == None:
          current_node.left_child = new_node
          return
        else:
          current_node = current_node.left_child
      elif data > current_node.data:
        if current_node.right_child == None:
          current_node.right_child = new_node
          return
        else:

Grafische Darstellung eines neuen Knotens und eines Binärsuchbaums mit einigen Elementen.

Datenstrukturen und Algorithmen in Python

Einfügen

def insert(self, data):
  new_node = TreeNode(data)
  if self.root == None:
    self.root = new_node
    return
  else:
    current_node = self.root
    while True:
      if data < current_node.data:
        if current_node.left_child == None:
          current_node.left_child = new_node
          return
        else:
          current_node = current_node.left_child
      elif data > current_node.data:
        if current_node.right_child == None:
          current_node.right_child = new_node
          return
        else:
          current_node = current_node.right_child

Grafische Darstellung eines neuen Knotens und eines Binärsuchbaums mit einigen Elementen. current_node ist das rechte Kind der Wurzel.

Datenstrukturen und Algorithmen in Python

Einfügen

def insert(self, data):
  new_node = TreeNode(data)
  if self.root == None:
    self.root = new_node
    return
  else:
    current_node = self.root
    while True:
      if data < current_node.data:
        if current_node.left_child == None:
          current_node.left_child = new_node
          return 
        else:
          current_node = current_node.left_child
      elif data > current_node.data:
        if current_node.right_child == None:
          current_node.right_child = new_node
          return
        else:
          current_node = current_node.right_child

Grafische Darstellung eines neuen Knotens und eines Binärsuchbaums mit einigen Elementen. current_node ist das rechte Kind der Wurzel. Der neue Knoten ist das linke Kind von current_node.

Datenstrukturen und Algorithmen in Python

Löschen

  • Keine Kinder

Grafische Darstellung eines Binärsuchbaums mit einigen Elementen. Ein Knoten ist rot markiert, da er entfernt wird. Dieser Knoten hat keine Kinder.

Datenstrukturen und Algorithmen in Python

Löschen

  • Keine Kinder
    • löschen

Grafische Darstellung eines Binärsuchbaums mit einigen Elementen. Der zu entfernende Knoten ist aus dem Baum verschwunden.

Datenstrukturen und Algorithmen in Python

Löschen

  • Ein Kind

Grafische Darstellung eines Binärsuchbaums mit einigen Elementen. Ein Knoten ist rot markiert, da er entfernt wird. Dieser Knoten hat ein rechtes Kind.

Datenstrukturen und Algorithmen in Python

Löschen

  • Ein Kind
    • löschen
    • Kind mit Elternknoten verbinden

Grafische Darstellung eines Binärsuchbaums mit einigen Elementen. Der entfernte Knoten ist verschwunden und die Wurzel zeigt auf das rechte Kind des entfernten Knotens.

Datenstrukturen und Algorithmen in Python

Löschen

  • Ein Kind
    • löschen
    • Kind mit Elternknoten verbinden

Grafische Darstellung eines Binärsuchbaums.

Datenstrukturen und Algorithmen in Python

Löschen

  • Zwei Kinder

Grafische Darstellung eines Binärsuchbaums, bei dem der Wurzelknoten gelöscht werden soll und rot markiert ist.

Datenstrukturen und Algorithmen in Python

Löschen

  • Zwei Kinder
    • durch den Nachfolger ersetzen
      • der Knoten mit dem kleinsten Wert, der größer ist als der des Knotens
    • Nachfolger finden:

Grafische Darstellung eines Binärsuchbaums, bei dem der Wurzelknoten gelöscht werden soll und rot markiert ist.

Datenstrukturen und Algorithmen in Python

Löschen

  • Zwei Kinder
    • durch den Nachfolger ersetzen
      • der Knoten mit dem kleinsten Wert, der größer ist als der des Knotens
    • Nachfolger finden:
      • rechtes Kind besuchen

Grafische Darstellung eines Binärsuchbaums, bei dem der Wurzelknoten gelöscht werden soll und rot markiert ist. Das rechte Kind der Wurzel ist gelb markiert.

Datenstrukturen und Algorithmen in Python

Löschen

  • Zwei Kinder
    • durch den Nachfolger ersetzen
      • der Knoten mit dem kleinsten Wert, der größer ist als der des Knotens
    • Nachfolger finden:
      • rechtes Kind besuchen
      • dann links entlang bis zum Ende

Grafische Darstellung eines Binärsuchbaums, bei dem der Wurzelknoten gelöscht werden soll und rot markiert ist. Ein weiterer Knoten ist gelb markiert, um den Nachfolger zu finden.

Datenstrukturen und Algorithmen in Python

Löschen

  • Zwei Kinder
    • durch den Nachfolger ersetzen
      • der Knoten mit dem kleinsten Wert, der größer ist als der des Knotens
    • Nachfolger finden:
      • rechtes Kind besuchen
      • dann links entlang bis zum Ende

Grafische Darstellung eines Binärsuchbaums, bei dem der Wurzelknoten gelöscht werden soll und rot markiert ist. Ein weiterer Knoten ist gelb markiert, um den Nachfolger zu finden.

Datenstrukturen und Algorithmen in Python

Löschen

  • Zwei Kinder
    • durch den Nachfolger ersetzen
      • der Knoten mit dem kleinsten Wert, der größer ist als der des Knotens
    • Nachfolger finden:
      • rechtes Kind besuchen
      • dann links entlang bis zum Ende

Grafische Darstellung eines Binärsuchbaums, bei dem der Wurzelknoten gelöscht werden soll und rot markiert ist. Ein weiterer Knoten ist gelb markiert, um den Nachfolger zu finden. Der Nachfolger wurde gefunden und ist die Zahl 13.

Datenstrukturen und Algorithmen in Python

Löschen

  • Zwei Kinder
    • durch den Nachfolger ersetzen
      • der Knoten mit dem kleinsten Wert, der größer ist als der des Knotens
    • Nachfolger finden:
      • rechtes Kind besuchen
      • dann links entlang bis zum Ende

Grafische Darstellung eines Binärsuchbaums. Der Wurzelknoten wurde durch den Nachfolger ersetzt.

Datenstrukturen und Algorithmen in Python

Löschen

  • Zwei Kinder
    • durch den Nachfolger ersetzen
      • der Knoten mit dem kleinsten Wert, der größer ist als der des Knotens
    • Nachfolger finden:
      • rechtes Kind besuchen
      • dann links entlang bis zum Ende
      • falls der Nachfolger ein rechtes Kind hat:

Grafische Darstellung eines Binärsuchbaums, bei dem der Nachfolger ein rechtes Kind hat.

Datenstrukturen und Algorithmen in Python

Löschen

  • Zwei Kinder
    • durch den Nachfolger ersetzen
      • der Knoten mit dem kleinsten Wert, der größer ist als der des Knotens
    • Nachfolger finden:
      • rechtes Kind besuchen
      • dann links entlang bis zum Ende
      • falls der Nachfolger ein rechtes Kind hat:
        • Kind wird linkes Kind des Nachfolger-Elterns.

Grafische Darstellung eines Binärsuchbaums, bei dem der Nachfolger ein rechtes Kind hatte. Dieses Kind wurde zum linken Kind des Nachfolger-Elterns, und die Wurzel wurde durch den Nachfolger ersetzt.

Datenstrukturen und Algorithmen in Python

Einsatzgebiete

  • Listen effizient ordnen
  • Viel schnelleres Suchen als in Arrays und verketteten Listen
  • Viel schnelleres Einfügen und Löschen als in Arrays
  • Dient zur Implementierung fortgeschrittener Datenstrukturen:
    • dynamische Mengen
    • Lookup-Tabellen
    • Prioritätswarteschlangen
Datenstrukturen und Algorithmen in Python

Lass uns üben!

Datenstrukturen und Algorithmen in Python

Preparing Video For Download...