AuD Übung 08 Bäume (Stefan Bosse) [15.1.2025]

AuD Übung Bäume (08)

Gruppennummer und Namen der Gruppenmitglieder (Zeilenformat!)
Punkte:Total/21./22./23./24./25./26./2

Abgabe: 24.1.2025

AuD Übung Bäume (08)
Bäume - Grundlagen
Bäume - Programmierung
Datenstrukturen
Algorithmen
Programm

In dieser Übung soll die Erzeugung, der Zugriff und die Manipulation von Daten mit Baumstrukturen erfolgen.

Bäume - Grundlagen

Aufgabe 1. Welche Eigenschaften haben Binärbäume?


Aufgabe 2. Es wird von geordneten Binärbäumen ausgegenagen. Was muss beachtet werden wenn neue Knoten eingefügt und bestehende gelöscht werden? Wie ist die Ordnungsrelation?


Bäume - Programmierung

Datenstrukturen

Definition 1. Knoten eines Baums und der Baum gleich dem Wurzelknoten
type node = {
  left  : node|null,
  right : node|null,
  data  : string,
  key   : number
}
type tree = node|null

Algorithmen

Nachfolgend sind die aus der Vorlesung bekannten Algorithmen in Pseudonotation zusammengefasst.

Algorithmus 1. Einfügen eines Elements in den Baum mit node als Wurzelknoten
function insert(node,data,key) {
  if (node.key==key) error(Error);
  if (k>node.key) {
    if (!node.right) node.right=Node(data,key)
    else insert(node.right,data,key)
  } else {
    if (!node.left) node.left=Node(data,key)
    else insert(node.left,data,key)    
  }
}
Algorithmus 2. Entfernen eines Elements aus dem Baum mit dem Wurzelknoten root
function removeNode(root,k) {
  // Eingabe: Wurzel vom Suchbaum T, Schlüssel k des zu löschenden Elementes
  node = searchNode (root, k)
  if (node = null) error(Error)
  parent = searchParentofNode(root, node) // Sollte mit Search kombiniert werden
  /* 1. Fall */
  if (!node.left && !node.right) { // node ist Blattknoten 
    if (parent.left===node) // node ist linkes Kind 
      parent.left = null
    else 
      parent.right = null
  /* 2. Fall */
  } else if (!node.left)  {
    if (parent.left===node)  // node ist linkes Kind 
      parent.left = node.right
    else 
      parent.right = node.right
  } else if (!node.right) {
    if (parent.left===node) // node ist linkes Kind 
      parent.left  = node.left
    else
      parent.right = node.left
  } else /* 3. Fall */
    child = searchMinimalElement (node.right) 
    replaceNode(node,child) // Ersetze node durch child
  }
}
Algorithmus 3. Suche eines Knotens mit dem Schlüssel k in einem Baum mit dem Wurzelknoten node
function search (node,k) {
  if (node.key==k) return node
  if (node.left && node.left.key<k) return search(node.left,k)
  if (node.right && node.right.key<k) return search(node.right,k)
  error(NOTFOUND)
}

searchNode liefert den Knoten zum Schlüssel k, seachParentNode sucht dann den Vorgänger zu diesem Knoten. Beide Suchfunktionen sollten kombiniert werden in dem die Suche zustandsbasiert den letzten Elternknoten speichert und seachParentNode dann auf das letzte Ergebnis zurückgreift (ein Cache).

Programm

Aufgabe 3. Erstelle die Knotenklasse Node und füge den Programmkode unten ein. Neben der Konstruktionsmethode soll es noch eine print Methode geben die den aktuellen Inhalt eines Knotens formattiert ausgibt.


Klasse *Node'

 ▸ 
 ℂ 
 ℙ 
[]
 ✗ 
 ≡ 

VEJB

Aufgabe 4. Erstelle die Baumklasse Tree und füge den Programmkode unten ein. Diese Klasse muss alle oben eingeführten Funktionen und Hilfsfunktionen enthalten um Knoten einfügen, entfernen und suchen zu können. Weiterhin soll eine Methode print geben die den Baum im ASCII Format ausgibt (s.u.).


Klasse *Tree'

 ▸ 
 ℂ 
 ℙ 
[]
 ✗ 
 ≡ 

VEJB

Definition 2. Ausgabeformat der print Methode für einen Binärbaum. Bei den Abständen (Leerraum und Positionierung der Knotenschlüssel) wird immer von einem balanziertn Baum der Höhe H ausgegangen. H ist hier die tatsächliche Höhe. Bei einem nicht balanzierten Baum bleiben Positionen leer. Der minimale Abstand zwischen Klammerpaaren sind zwei Leerzeichen.
                       [10]
                [2]           [11]
            [1]     [5]  [20]      [30]   

Aufgabe 5. Erstelle eine Tabelle mit allen Nobelpreisträgern wo die Jahreszahl (letze beiden Jahreszahlen) eine Primzahl darstellen, also z.B. 1907, 2013. Die Daten finden sich unter https://de.wikipedia.org/wiki/Liste_der_Nobelpreistr%C3%A4ger.


Datentabellen

 ▸ 
 ℂ 
 ℙ 
[]
 ✗ 
 ≡ 

VEJB

Aufgabe 6. Teste nun die Implementierung mit nachfolgenden Beispielen. Da die Datentabellen vermutlich aufsteigend nach dem Schlüssel sortiert sind sollen die Datensätze randomisiert eingeführt werden. Dazu soll randomisiert ein Index der Datentabelle (names,years) ausgewählt werden. Das Problem: Ein Datensatz darf nicht zweimal eingefügt werden. Suche nach einer Lösung! Teste den Baum indem alle Datensätze gesucht werden und der Schlüssel und der ermittelte Knoten verglichen werden. Anschliessend werden die Knoten mit den Jahren 1903, 1913, 2003 und 2013 entfernt. Teste nochamls auf Korrektheit des Baums.


Test

 ▸ 
 ℂ 
 ℙ 
[]
 ✗ 
 ≡ 

VEJB


Created by the NoteBook Compiler Ver. 1.34.2 (c) Dr. Stefan Bosse (Sat Jan 18 2025 13:33:21 GMT+0100 (Central European Standard Time))