Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Diskrete Mathematik I Vorlesung 6 Binärer Suchbaum II Diskrete Mathe 1 1 2 3 4 5 6 7 Übersicht • • Der Binäre Baum Binärer Suchbaum – Definition – Beispiel – Die Klasse Knoten – Die Klasse Binärer Suchbaum (BST) – FügeEin Rekursiv – Suchen von Knoten 8 9 10 11 12 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Der Binäre Baum • • Ein leerer Baum ist ein binärer Baum Sind L und R zwei binäre Bäume und w ein Knoten mit dem Inhalt n, dann ist die Verknüpfung von w, L und R ein binärer Baum. n L R Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Binärer Suchbaum • Ein binärer Baum B ist ein binärer Suchbaum, falls er leer ist oder die folgenden Eigenschaften erfüllt sind: – die beiden Unterbäume sind binäre Suchbäume – die Beschriftungen der Knoten des linken Suchbaums sind kleiner als die Beschriftung der Wurzel – die Beschriftungen des rechten Suchbaums sind größer als die Beschriftung der Wurzel n <n >n Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Binärer Suchbaum Aufbau eines binären Suchbaums aus folgenden Elementen: 9 4 17 13 2 23 7 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Binärer Suchbaum 9 17 4 2 7 13 23 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Die Klasse Knoten class Knoten { private int wert; private Knoten links, rechts; Knoten(int i) { wert = i; links = rechts = null; } void SetzeWert(int i) { wert = i; } int GibWert() { return wert; } void SetzeLinks(Knoten k) { links = k; } Knoten GibLinks() { return links; } void SetzeRechts(Knoten k) { rechts = k; } Knoten GibRechts() { return rechts; } } Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 Die Klasse Binärer Suchbaum (BST) class BST { private Knoten Wurzel; class Knoten {...} BST() { wurzel = null; } void FügeEin(int i) { wurzel = FügeEin(wurzel, i); } } Aufruf der rekursiven Prozedur 12 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 FügeEin Rekursiv private Knoten FügeEin(Knoten aktuell, int ein) { if (aktuell == null) { aktuell = new Knoten(ein);} else { if (ein < aktuell.GibWert()) aktuell.SetzeLinks(FügeEin(aktuell.GibLinks(), ein)); if (ein > aktuell.GibWert()) aktuell.SetzeRechts(FügeEin(aktuell.GibRechts(), ein)); } return aktuell; } Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Suchen von Knoten Suche einer Zahl k in einem binären Suchbaum B • B ist leer – k kann nicht im Baum sein. • B ist nicht leer – B.wert = k : k ist gefunden, d.h. bereits in B vorhanden. – B.wert < k : Suche im rechten Unterbaum von B. – B.wert > k : Suche im linken Unterbaum von B. Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Suchen von Knoten • Suche für k = 15 16 10 24 9 14 13 A 13x 18 15 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Suchen von Knoten • Suche für k = 15 16 k < 16 10 24 9 14 13 A 13x 18 15 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Suchen von Knoten • Suche für k = 15 16 10 24 k > 10 9 14 13 A 13x 18 15 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Suchen von Knoten • Suche für k = 15 16 10 9 24 k > 14 13 A 13x 14 18 15 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Suchen von Knoten • Suche für k = 15 16 10 24 9 14 13 A 13x 18 15 k = 15 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Suchen von Knoten • Suche für k = 11 16 k < 16 10 24 9 14 13 A 10x 18 15 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Suchen von Knoten • Suche für k = 11 16 10 24 k > 10 9 14 13 A 10x 18 15 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Suchen von Knoten • Suche für k = 11 16 10 9 24 k < 14 13 A 10x 14 18 15 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Suchen von Knoten • Suche für k = 11 16 10 24 9 k nicht vorhanden A 10x 14 13 18 15 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Suchen von Knoten class BST { ... boolean Suche(int i) { return Suche(wurzel, i); } private boolean Suche(Knoten aktuell, int i) { boolean gefunden = false; Vergleich if (aktuell != null) { gefunden = (aktuell.GibWert() == i) ; if (aktuell.GibWert() < i) gefunden = Suche(aktuell.GibRechts(), i); if (aktuell.GibWert() > i) gefunden = Suche(aktuell.GibLinks(), i); } return gefunden; } ...}