www.vorhilfe.de
Vorhilfe

Kostenlose Kommunikationsplattform für gegenseitige Hilfestellungen.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Navigation
 Startseite...
 Neuerdings beta neu
 Forum...
 vorwissen...
 vorkurse...
 Werkzeuge...
 Nachhilfevermittlung beta...
 Online-Spiele beta
 Suchen
 Verein...
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "Algorithmen und Datenstrukturen" - binäre bäume
binäre bäume < Algor.+Datenstr. < Theoretische Inform. < Hochschule < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Algorithmen und Datenstrukturen"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

binäre bäume: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 10:22 Do 21.06.2007
Autor: AriR

Aufgabe
Erläutern Sie, wie man einen binären Suchbaum mit dem Schlüsseltyp int so in einen int–Array
a umwandeln kann, dass man aus a den Suchbaum in der ursprünglichen Form rekonstruieren
kann. Geben sie Algorithmen für beide Richtungen an (Suchbaum <--> Array) und begründen Sie
Korrektheit und Laufzeit.

hey leute,

ich dachte mir, da binäre bäume nicht eindeutig bestimmt sind, muss man die wurzel kennen um diese genau so wieder aus dem array erstellen zu können, wie sie ursprünlich aussahen.

dachte mir dann, dass man die wurzel in an der stelle 0 des arrays einspeichert und den rest einfach reihenweise rein angefangen mit dem kleinsten element (Also immer getMin() und removeMin() bis der baum leer ist)

danach könnte man wieder um den baum zu rekonstruieren einfach reihenweise die elemente aus dem array angefagen bei 0 wieder in den baum einfügen und es müsste der selbe baum wieder haurauskommen, den man ursprünglich hatte, da beide die selbe wurzel haben oder nicht?

mein problem ist jetzt, dass ich keine ahnung habe wie ich die wurzel aus der schnittstelle eines binären baums bekommen kann.

mir stehen nur folgende methoden zur verfügung:

// ******************PUBLIC OPERATIONS*********************
// void insert( x )       --> Insert x
// void remove( x )       --> Remove x
// void removeMin( )      --> Remove minimum item
// Comparable find( x )   --> Return item that matches x
// Comparable findMin( )  --> Return smallest item
// Comparable findMax( )  --> Return largest item
// boolean isEmpty( )     --> Return true if empty; else false
// void makeEmpty( )      --> Remove all items


wäre super, wenn mir einer von euch helfe könnte :)

Gruß ;)

        
Bezug
binäre bäume: Antwort
Status: (Antwort) fertig Status 
Datum: 14:17 Do 21.06.2007
Autor: devilofdeath


> Erläutern Sie, wie man einen binären Suchbaum mit dem
> Schlüsseltyp int so in einen int–Array
>  a umwandeln kann, dass man aus a den Suchbaum in der
> ursprünglichen Form rekonstruieren
>  kann. Geben sie Algorithmen für beide Richtungen an
> (Suchbaum <--> Array) und begründen Sie
>  Korrektheit und Laufzeit.
>  hey leute,
>  
> ich dachte mir, da binäre bäume nicht eindeutig bestimmt
> sind, muss man die wurzel kennen um diese genau so wieder
> aus dem array erstellen zu können, wie sie ursprünlich
> aussahen.
>  
> dachte mir dann, dass man die wurzel in an der stelle 0 des
> arrays einspeichert und den rest einfach reihenweise rein
> angefangen mit dem kleinsten element (Also immer getMin()
> und removeMin() bis der baum leer ist)
>  
> danach könnte man wieder um den baum zu rekonstruieren
> einfach reihenweise die elemente aus dem array angefagen
> bei 0 wieder in den baum einfügen und es müsste der selbe
> baum wieder haurauskommen, den man ursprünglich hatte, da
> beide die selbe wurzel haben oder nicht?
>  
> mein problem ist jetzt, dass ich keine ahnung habe wie ich
> die wurzel aus der schnittstelle eines binären baums
> bekommen kann.
>  
> mir stehen nur folgende methoden zur verfügung:
>  
> // ******************PUBLIC
> OPERATIONS*********************
>  // void insert( x )       --> Insert x

>  // void remove( x )       --> Remove x

>  // void removeMin( )      --> Remove minimum item

>  // Comparable find( x )   --> Return item that matches x

>  // Comparable findMin( )  --> Return smallest item

>  // Comparable findMax( )  --> Return largest item

>  // boolean isEmpty( )     --> Return true if empty; else

> false
>  // void makeEmpty( )      --> Remove all items

>  
>
> wäre super, wenn mir einer von euch helfe könnte :)
>  
> Gruß ;)


mhm also ich kenn diese Beispiele nur mit sogenannter InOrder  (IO)Reihenfolge und PreOrder (PO)  Reihenfolge.

mal kurze erklärung dazu.

IO:
du fangst bei der wurzel an und gehst solange nach links bis du anstehst (=kleinstes element des Suchbaum) danach wird dieses ins array an die 1 Position geschrieben. dann gehst du eine ebene hinauf (zum Vater vom kleinsten) und schreibst den hinein ins array. danach schaust du ob dieser ein rechtes kind hat und schreibst es an die 3 stelle des arrays(falls vorhanden) ansonsten gehst du wieder eine ebene hinauf...


mal ein Bsp:

                             10
                          /        [mm] \ [/mm]
                        5          20
                     /     \      /     [mm] \ [/mm]
                   1       7   15    25

IO ergibt : 1,5,7,10,15,20,25

PO geht vom prinzip her ähnlich vor, nur das sofort das element wo sie ist ins array schreibt

PO ergibt : 10,5,1,7,20,15,25



wenn du nun aus PO und IO den baum erstellen willst gehst du wie folgt vor : du läufst von i=1 bis PO.size alle elemente durch.

PO[1]=Wurzel des Baums

nun musst du dir aus der IO die position des Wertes von PO[1] suchen.

hier ist dies pos 4 =>   alles was in der IO links dieser Position steht gehört zum linken unterbaum alles was rechts davon ist zum rechten.

   L               W                 R
1,5,7           10            15,20,25

nun nimmst du PO[2] her da dies das element ist was links von der wurzel steht.


dies ist PO[2]=5   dadurch das du weisst das es links von der Wurzel ist musst du nur in L suchen

pos=2

dein baum schaut jetzt so aus           10
                                                          /
                                                         5

nun siehst du das 5 in der mitte ist und teilst wieder in L und R auf.

nun niummst du PO[3]=1 und hast das linke element von 5

PO[4]=7  ist das rechte elemet von 5

analog geht das für die rechte seite des baumes!

hoffe das hilft dir! Musst dir halt nur überlegen wie es mit deinen Funktionen aussieht die du zur verfügung hast!

LG


Bezug
                
Bezug
binäre bäume: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 14:31 Do 21.06.2007
Autor: AriR

das ist ja so mehr oder weniger das problem..

ich bekomme mit den funktionen die wurzel nicht, auf jeden fall weiß ich nicht wie

Bezug
                        
Bezug
binäre bäume: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 14:54 Do 21.06.2007
Autor: Schmon

Hallo AriR

Das was devilofdeath da geschrieben hat ist auf jeden Fall richtig.
Wenn du die Preorder Reihenfolge des Baumes bekommst, dann
kannst du den Baum damit jeder Zeit wieder aufbauen.

Die Operationen welche dir zur Verfügung stehen helfen dabei allerdings nicht
sehr weit.

Die Wurzel allerdings dürfte kein Problem sein, denn die Variabel, in welcher der Baum gespeichert ist (wird wohl ein Pointer sein) zeigt (bei sinnvollen Implementierungen) immer auf die Wurzel, das heisst wenn du die Variabel dereferenzierst hast du deine Wurzel.

Wie du allerdings an den Rest kommen möchtest das versteh ich nicht ganz aber veilleicht hats dir ja schon geholfen.

Wäre nett ein kleines Feedback zu bekommen


Gruss Schmon

Bezug
                                
Bezug
binäre bäume: Frage (überfällig)
Status: (Frage) überfällig Status 
Datum: 15:16 Do 21.06.2007
Autor: AriR

leider nicht, denn ich kann ja nicht in der implementierung des baums rumspielen sonder darf diese nur als schnittstelle betrachten, d.h. ich darf nur die oben genannten methoden dafür verweden :(

ich hab ka wie ich damit die wurzel bekomme oder ich muss einen ganz anderen weg gehen, aber auf die art weiß ich nur, wie ich einen äquivalten binärbaum bekomme und nicht exakt den selben

Bezug
                                        
Bezug
binäre bäume: Fälligkeit abgelaufen
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 15:22 Di 26.06.2007
Autor: matux

$MATUXTEXT(ueberfaellige_frage)
Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Algorithmen und Datenstrukturen"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
www.mathebank.de
[ Startseite | Forum | Wissen | Kurse | Mitglieder | Team | Impressum ]