Binäre Suchbäume
Binäre Suchbäume dienen der effizienten Implementierung von sogenannten
DICTIONARIES,
das sind Datentypen zur Darstellung von Mengen, welche die Operationen
INSERT, DELETE und MEMBER, also Einfügen eines Elementes, Löschen
eines Elementes und den Test auf "Enthaltensein" eines Elementes zu
Verfügung stellen.
Alle drei Algorithmen für INSERT, DELETE und MEMBER folgen jeweils
einem einzigen Pfad im Baum von der Wurzel zu einem Blatt oder zu einem
inneren Knoten. Der Aufwand ist proportional zu der Länge dieses
Pfades. Bekannterweise ist die maximale Pfadlänge in einem balancierten
Baum O(log n) und O(n) in einem degenerierten Baum, wobei n hier die
Anzahl der Knoten des Baumes ist.
Ein degenererierter Baum entsteht z.B. wenn die Folge der einzufügenden
Knoten bereits sortiert vorliegt.
Im folgenden Script wurden die drei
Operationen in perl implementiert.
#!/usr/bin/perl use strict; use warnings; use Data::Dumper;; # search for $x in tree $t. If $x is found, # returns 1, otherwise returns 0 sub member { my ($t,$x) = @_; if (!defined($t)) { return 0;} elsif ($x eq $t->{key}) { return 1;} elsif ($x le $t->{key}) { return &member($t->{left},$x) } else { return &member($t->{right},$x) } # $x > $t->{key} } # search for $x in tree $t. If $x is found, returns node # containing $x1, otherwise returns undef sub find { my ($t,$x) = @_; if (!defined($t)) { return undef;} elsif ($x eq $t->{key}) { return $t;} elsif ($x le $t->{key}) { return &member($t->{left},$x) } else { return &member($t->{right},$x) } # $x > $t->{key} } # insert $element $x in tree $t sub insert { my $t = \$_[0]; my $x = \$_[1]; if (!defined($$t)) { # empty tree, create node andinsert $x in it $$t = {}; $$t->{key} = $$x; $$t->{left} = undef; $$t->{right} = undef; } else { # if element not already in tree if ($$t->{key} ne $$x) { # insert element in the correct subtree if ($$t->{key} gt $$x) { &insert($$t->{left},$$x); } else { &insert($$t->{right},$$x); } } } } # create a file suitable for "dot" sub traverse { my ($t) = @_; if (!defined($t)) { return undef;} if (defined $t->{left}) { print $t->{key}." -> ".$t->{left}->{key}."\n"; &traverse($t->{left}); } if (defined $t->{right}) { print $t->{key}." -> ".$t->{right}->{key}."\n"; &traverse($t->{right}); } } sub print_graph { print EOT; digraph hierarchy { //nodesep=1.0 // increases the separation between nodes node [color=black,fontcolor=black] edge [color=black] //setup options EOT &traverse($_[0]); print EOT; } EOT } # main program my $tree = undef; #srand (time ^ $$); #foreach (1 .. 12) {&insert($tree, int(rand 100))} foreach ( qw(Binaere Suchbaeume dienen der Implementierung von DICTIONARIES)) { &insert($tree,lc $_); } &print_graph($tree);Im obenstehenden Script wird ein kleiner Beispieltext Wort für Wort in einen binären Suchbaum eingefügt. Das Bild links zeigt den dadurch erzeugten Baum.
Die Subroutine print_graph gibt den Baum dann im dot-Format aus. Damit kann beispielsweise eine graphische Darstellung des Baumes wie die nebenstehende im gif-oder PostScript-Format erzeugt werden.
Alle Touren
Schneebergwege
- Bergrettungssteig
- Emmysteig
- Fadensteig
- Ferdinand Mayr-Weg
- Fischersteig
- Franz-Josef-Promenade
- Hotelries
- Hochgang
- Krummbachgraben
- Kuhschneeberg
- Kuhsteig
- Lärchkogelgrat
- Nandlgraben
- Nandlgrat
- Nandlgrat (Alter Nandlsteig)
- Niederlauf
- Novembergrat
- Nördlicher Grafensteig
- Oberer Herminensteig
- Stadelwandgraben
- Südlicher Grafensteig
- Waxriegel
- Weichtalklamm
Raxsteige
- Alpenvereinssteig
- Altenbergsteig
- Bärenlochsteig
- Brandschneide
- Camillo Kronich-Steig
- Gaisloch
- Gamsecksteig
- Gretchensteig
- Göbl Kühn-Steig
- Großes Fuchsloch
- Großes Wolfstal
- Großer Kesselgraben
- Ho Chi Minh Pfad
- Hoyossteig
- Karl Kantner-Steig
- Kaisersteig
- Kontruszsteig
- Kronich Eisenweg
- Martinsteig
- Peter Jokel-Steig
- Preinerwandsteig
- Raxenmäuersteig
- Reisstalersteig
- Rudolfsteig
- Schlangenweg
- Staudengraben
- Wildfährte
- Teufelsbadstubensteig
- Törlweg
- Waxriegelsteig
- Wachthüttelkamm
Geführte Touren
- Gösing Hoyos-Steig
- Gösing und Flatzer Wand
- Gösing Hoyos-Steig
- Kienberg und Himberg
- Flatzer Wand und Gösing
- Gösing Hoyos-Steig
- Gahns Saurüssel
- Rax mit Schneeschuhen
- Himberg und Kienberg
- Flatzer Wand und Gösing
- Gösing Hoyossteig
- Prettschachersteig und Krummbachstein
- Schneeberg Oktobergrat
- Gösing Hoyossteig
- Semmering Bahnwanderweg
- Miesenbach Biedermeierrunde
- Gösing Hoyossteig
- Rax mit Schneeschuhen
- Flatzer Wand und Gösing
- Gösing Hoyossteig
- Schneeberg Novembergrat
- Schneeberg Grafensteig und Hengst
- Schneeberg Nandlgrat
- Gösing Hoyossteig
- Gahns Saurüssel
- Biedermeierrunde Miesenbach
- Gösing Hoyossteig
- Gösing Hoyossteig
- Rax mit Schneeschuhen
- Gahns Saurüssel
- Rax mit Schneeschuhen
- Gösing Hoyossteig
- Schneeberg Novembergrat
- Krummbachstein
- Schneeberg Oktobergrat
- Schneeberg Alter Nandlsteig
- Schneeberg Herminensteig
- Gösing und Flatzer Wand
- Rax mit Schneeschuhen
- Gösing Hoyossteig
- Schneeberg_Novembergrat
- Schneeberg Alter Nandlsteig
- Schneeberg Herminensteig
- Schneeberg Brandmauer und Stadelwand
- Schneeberg und Hengst
- Gösing Hoyos-Steig
- Rax mit Schneeschuhen
- Schneeberg Herminensteig und Hengst
- Schneeberg Novembergrat
- Schneeberg Herminensteig
- Schneeberg Herminensteig
- Schneeberg Alter Nandlsteig
- Miesenbach Biedermeierrunde
- Flatzer Wand und Gösing
- Dürre Leiten mit Schneeschuhen
- Rax mit Schneeschuhen
- Dürre Leiten mit Schneeschuhen
- Schneeberg Brandmauer
- Schneeberg Novembergrat
- Miesenbach Biedermeierrrunde
- Gahns Eng und Saurüssel mit Schneeschuhen
- Kuhschneeberg mit Schneeschuhen
- Novembergrat
- Nördlicher Grafensteig und Hengst
- Miesenbach Biedermeierrunde
- Flatzer Wand und Gösing
- Großes Wolfstal
- Alter Nandlsteig
- Herminensteigvariationen
- Gahns Saurüssel mit Schneeschuhen
- Dürre Leiten mit Schneeschuhen
- Kuhschneeberg mit Schneeschuhen
- Flatzer Wand und Gösing
- Großes Wolfstal
- Alter Nandlsteig
- Biedermeierrunde in Miesenbach
- Gahns Saurüssel und Eng