TweakPC

Zurück   Computer Hardware Forum - TweakPC > Games und Software > Programmiersprachen
Registrieren Hilfe Community Downloads

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 01.07.2009, 11:40   #1 (permalink)
Extrem Tweaker
 
Benutzerbild von kanonenfutter
 

Registriert seit: 10.07.2006
Beiträge: 2.290

kanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblick

Standard Binärbaum in C ausgeben

Hallöchen

Ich möchte eine erstellten Binärbaum wie folgt ausgeben:

a (Wurzel)
bc
defg
...

Muss also nicht die typische Baumstruktur sein. Bisher schaff ich die Ausgabe folgendermaßen:
a b c d e f g ...

Ich würde auch
a
b c

hinbekommen, die unteren Ebenen funktionieren dann aber nicht mehr.

Also zwar schon in der richtigen Reiehnfolge, allerdings kann ich die Zeilenumbrüche nicht so setzen, dass eben genau dann umgebrochen wird, wenn eine neue Ebene erreicht wird.

Könnt ihr mir da mit einem kleinen Pseudocode helfen?

Die Augabe sieht atm so aus:

Spoiler:
void ZeigeBaum(TKnoten * p_pWurzel)
{
printf("Erzeugter Baum \n");
printf("--------------------------------\n\n");

if(p_pWurzel == NULL)
{
printf("Der Baum ist leer!");
}
else
{
printf("%d \n", p_pWurzel->iInhalt);

ZeigeBaum_Innen(p_pWurzel->pKindLinks, 1);
ZeigeBaum_Innen(p_pWurzel->pKindRechts, 1);
printf("\n");

}
}

///////////////////////////////////////////////////////////////////////////////////////

void ZeigeBaum_Innen(TKnoten * p_pWurzel, int p_iEbene)
{
if(p_pWurzel == NULL)
{
}
else
{
printf("%d ", p_pWurzel->iInhalt);
}


Damit bekomm ich oben angesprochene Struktur von
a
b c

hin, mehr leider nicht

Vllt. habt ihr ja eine Idee?

mfg

----------

In der Funktion ZeigeBaum_Innen muss ich ja wahrscheinlich wieder irgendwie rekursiv aufrufen, hab aber leider kA was wann und wie... ;(
kanonenfutter ist offline   Mit Zitat antworten
Alt 01.07.2009, 12:36   #2 (permalink)
The real MacGyver
 
Benutzerbild von Fakk-asrock
 

Registriert seit: 10.02.2005
Beiträge: 5.762

Fakk-asrock ist ein wunderbarer AnblickFakk-asrock ist ein wunderbarer AnblickFakk-asrock ist ein wunderbarer AnblickFakk-asrock ist ein wunderbarer AnblickFakk-asrock ist ein wunderbarer AnblickFakk-asrock ist ein wunderbarer AnblickFakk-asrock ist ein wunderbarer AnblickFakk-asrock ist ein wunderbarer Anblick

Standard AW: Binärbaum in C ausgeben

Du brauchst in jedem element 3 Zeiger:
nachfolger links, nachfolger rechts und den vorgänger.

je nachdem was du vorhast musst du dann die elemente in der richtigen reinfolge eingeben oder eine sortierfunktion einbauen.

Ich hab das ganze nur mal mit pascal gemacht, von prinzip aber das gleiche (lineare Liste).
Fakk-asrock ist offline   Mit Zitat antworten
Alt 01.07.2009, 12:47   #3 (permalink)
Extrem Tweaker
 
Benutzerbild von kanonenfutter
 

Registriert seit: 10.07.2006
Beiträge: 2.290

kanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblick

Standard AW: Binärbaum in C ausgeben

Prinzipiell müsste ich ja nur folgendes machen:

Wert der Wurzel ausgeben, Zeilenwechsel (funzt)
Wert des linken und des rechten Nachfolgers ausgeben, Zeilenwechsel (geht)

Den linken/rechten Nachfolger vom linken und rechten Nachfolger der Wurzel ausgeben.

usw.

Um den linken/rechten Nachfolger des linken Nachfolgers der Wurzel ausgeben zu können kann ich zB die gleichen Funktionen verwenden und vorher den linken Nachfolger der Wurzel als neue Wurzel deklarieren. Das würde noch gehen, dann hab ich aber das Problem das ich nicht mehr in den rechten Teilbaum komme :/

Sry, bisschen verwirrend vllt. ^^

Ich will eigtl. nur folgendes:
Wurzel ausgeben, Zeilenwechsel
Ebene 1 von links nach rechts ausgeben, Zeilenwechsel
.
.

Das muss irgendwie rekursiv funzen, hab aber keine Ahnung wie?!

mfg
kanonenfutter ist offline   Mit Zitat antworten
Alt 01.07.2009, 13:33   #4 (permalink)
Hardware Freak
 

Registriert seit: 28.03.2003
Beiträge: 8.252

redfalcon kann auf vieles stolz sein
redfalcon kann auf vieles stolz sein

Standard AW: Binärbaum in C ausgeben

In einer meiner Vorlesungsfolien war das drin, allerdings Cpp:

PHP-Code:
void traverse(Knoten *node) {
if(
node != NULL) {
cout << *((TDaten*) node->daten)<< endl;
traverse(node->l);
traverse(node->r);
}

Später mehr.
redfalcon ist offline   Mit Zitat antworten
Alt 01.07.2009, 16:11   #5 (permalink)
Extrem Tweaker
 
Benutzerbild von kanonenfutter
 

Registriert seit: 10.07.2006
Beiträge: 2.290

kanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblick

Standard AW: Binärbaum in C ausgeben

Das wäre klasse

Ich versuch mich gerade an einer anderen Idee:
Ich werfe den Baum auf die Seite und gebe von links nach rechts aus:

aaac
a
aaab

statt

aaaaaaa
b aaaaac

Das geht garantiert einfacher (zumindest versteh ich es leichter ) allerdings fehlt mir auch hier noch der ultimative Algoritmus ;(

Nur wäre es hier prinzipiell so zu lösen (da ja die Konsole von oben nach unten schreibt), dass ich zuerst den größten wert (am weitesten rechts s Bsp f) ausgeben müsste, davor mit Tiefe x Tabs um ihn entsprechend weit einzurücken. Dann Zeilenwechsel. Dann entsprechend dessen Wurzel (e). Dann der linke Sohn dieser Wurzel (g). Usw....

aaaaaaaaaaf
aaaaae
aaaaaaaaaag
a
aaaaaaaaaab
aaaaac
aaaaaaaaaad

....

Die nötige Rekursion will nicht in meinen Kopf

mfg
kanonenfutter ist offline   Mit Zitat antworten
Alt 01.07.2009, 17:00   #6 (permalink)
Extrem Tweaker
 
Benutzerbild von kanonenfutter
 

Registriert seit: 10.07.2006
Beiträge: 2.290

kanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblick

Standard AW: Binärbaum in C ausgeben

Update:

Der Quellcode sieht jetzt folgendermaßen aus und gibt mir dabei den Baum wie unten auf dem Bild zu sehen aus:

Spoiler:

void ZeigeBaum(TKnoten * p_pWurzel)
{
printf("Erzeugter Baum \n");
printf("--------------------------------\n\n");

if(p_pWurzel == NULL)
{
printf("Der Baum ist leer!");
}
else
{
ZeigeBaum_Innen(p_pWurzel->pKindRechts, 1);
printf("%d \n", p_pWurzel->iInhalt);
ZeigeBaum_Innen(p_pWurzel->pKindLinks, 1);
// printf("\n");
}

}

///////////////////////////////////////////////////////////////////////////////////////

void ZeigeBaum_Innen(TKnoten * p_pStelle, int p_iEbene)
{

if (p_pStelle == NULL)
{
}
else
{
ZeigeBaum_Innen(p_pStelle->pKindRechts, p_iEbene+1);
for(int i = 1; i<=p_iEbene; i++)
{
printf("\t");
}

printf("%d \n", p_pStelle->iInhalt);


ZeigeBaum_Innen(p_pStelle->pKindLinks, p_iEbene+1);
for( i = 1; i<=p_iEbene; i++)
{
printf("\t");
}

printf("%d \n", p_pStelle->iInhalt);
}


http://www.tweakpc.de/forum/members/...-unbenannt.jpg

Das Problem seht ihr ja
Der Baum ist vollständig und die Werte stimmen, allerdings sind eben einige doppelt. kA wieso und ich find auch den Fehler im Code nicht...?!

Jmd. ne Idee?

mfg
kanonenfutter ist offline   Mit Zitat antworten
Alt 02.07.2009, 16:09   #7 (permalink)
Extrem Tweaker
 
Benutzerbild von kanonenfutter
 

Registriert seit: 10.07.2006
Beiträge: 2.290

kanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblick

Standard AW: Binärbaum in C ausgeben

Keiner ne Idee? Ich kann noch 20mal drüber schauen und find den Fehler nich So schwerwiegend kann es ja nicht sein, wird nur ein Detailfehler sein, hab aber kA wo... ^^

Anscheinend wird irgend eine Funktion doppelt aufgerufen oder so?! Wenn ihr noch Erläuterungen zum Code braucht einfach bescheid geben, sofern das bei der Problemlösung helfen kann

thx und mfg
kanonenfutter ist offline   Mit Zitat antworten
Alt 02.07.2009, 18:18   #8 (permalink)
Extrem Tweaker
 
Benutzerbild von kanonenfutter
 

Registriert seit: 10.07.2006
Beiträge: 2.290

kanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblick

Standard AW: Binärbaum in C ausgeben

Sry für Quadpost

Lösung:
Spoiler:

void ZeigeBaum(TKnoten * p_pWurzel)
{
printf("Erzeugter Baum \n");
printf("--------------------------------\n\n");

if(p_pWurzel == NULL)
{
printf("Der Baum ist leer!");
}
else
{
ZeigeBaum_Innen(p_pWurzel->pKindRechts, 1);
printf("%d \n", p_pWurzel->iInhalt);
ZeigeBaum_Innen(p_pWurzel->pKindLinks, 1);
// printf("\n");
}

}

///////////////////////////////////////////////////////////////////////////////////////

void ZeigeBaum_Innen(TKnoten * p_pStelle, int p_iEbene)
{
if (p_pStelle == NULL) //Abbruch
{
}
else
{
ZeigeBaum_Innen(p_pStelle->pKindRechts, p_iEbene+1);

for(int i = 1; i<=p_iEbene; i++)
{
printf("\t");
}

printf("%d \n", p_pStelle->iInhalt);

ZeigeBaum_Innen(p_pStelle->pKindLinks, p_iEbene+1);

}
}

Musste nur den else Zweig der zweiten Funktion etwas abändern.
Funzt wunderbar ^^

mfg
kanonenfutter ist offline   Mit Zitat antworten
Antwort

Stichworte
ausgeben, binärbaum


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist aus.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Was muss man für ein Upgrade AGP->PCI-E ausgeben? redfalcon Komplett-PCs, Konfigurationen 5 25.12.2007 20:32
Brauche neue Grafikkarte! kann wenig ausgeben Devilbull AMD/ATI Radeon Grafikkarten 12 07.03.2007 16:38
avi videos ausgeben videogruber Audio und Video 1 04.03.2006 17:26
Hauptspeicherausnutzung unter Visual C++ ausgeben? Live Programmiersprachen 4 16.05.2004 13:43
Euer Baby!Wieviel habt ihr schon für euer PCSystem ausgeben? MoRecords Off Topic 82 16.08.2003 07:48


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:23 Uhr.






Powered by vBulletin® Version 3.8.10 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
SEO by vBSEO 3.5.2 ©2010, Crawlability, Inc.
Impressum, Datenschutz Copyright © 1999-2015 TweakPC, Alle Rechte vorbehalten, all rights reserved