Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Rekursiv Verzweigungen zählen in einem Baum » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Seiten (2): [1] 2 nächste » Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Rekursiv Verzweigungen zählen in einem Baum
Beiträge zu diesem Thema Autor Datum
 Rekursiv Verzweigungen zählen in einem Baum Chirs 11.01.2016 12:44
 RE: Rekursiv Verzweigungen zählen in einem Baum eulerscheZahl 11.01.2016 13:13
 RE: Rekursiv Verzweigungen zählen in einem Baum Chirs 13.01.2016 14:48
 RE: Rekursiv Verzweigungen zählen in einem Baum eulerscheZahl 13.01.2016 16:59
 RE: Rekursiv Verzweigungen zählen in einem Baum Chirs 14.01.2016 14:03
 RE: Rekursiv Verzweigungen zählen in einem Baum Chirs 15.01.2016 16:12
 RE: Rekursiv Verzweigungen zählen in einem Baum eulerscheZahl 15.01.2016 16:34
 RE: Rekursiv Verzweigungen zählen in einem Baum Chirs 15.01.2016 17:04
 RE: Rekursiv Verzweigungen zählen in einem Baum eulerscheZahl 15.01.2016 17:11
 RE: Rekursiv Verzweigungen zählen in einem Baum Chirs 15.01.2016 17:45
 RE: Rekursiv Verzweigungen zählen in einem Baum eulerscheZahl 16.01.2016 06:30
 RE: Rekursiv Verzweigungen zählen in einem Baum Chirs 16.01.2016 10:06
 RE: Rekursiv Verzweigungen zählen in einem Baum eulerscheZahl 16.01.2016 11:09
 RE: Rekursiv Verzweigungen zählen in einem Baum Chirs 17.01.2016 17:41
 RE: Rekursiv Verzweigungen zählen in einem Baum eulerscheZahl 17.01.2016 17:48
Nächste Seite »

Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Chirs
Mitglied


Dabei seit: 23.12.2015
Beiträge: 26

Rekursiv Verzweigungen zählen in einem Baum Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Meine Frage:
Hallo zusammen,

ich hätte eine Frage zur Vertiefung der Bäume. Und zwar habe ich bereits einige Aufgabe in meinem Studium zu den Bäumen gelöst ich möchte aber gerne dieses Wissen erweitern und hab mir nun selbst eine Aufgabe ausgedacht und zwar:

Wenn es möglich ist rekursiv Texte in einem Baum zu zählen bzw. den längsten Text zu ermitteln, dann müsste es auch möglich sein rekursiv die Verzeigungen in einem Baum zu zählen.


Doch leider stecke ich zur Zeit in der Überlegung fest wie ich die Anzahl der Verzweigungen in einem Textbaum feststelle.


Vielleicht kann mir hier jemand weiterhelfen.



Ich bedanke mich schon mal im Voraus



VG,


Chris

Meine Ideen:
Meine Idee ist nun eine Rekursive C-Funktion zu schreiben die die Verzweigungen in einem Textbaum zählt.
11.01.2016 12:44 Chirs ist offline E-Mail an Chirs senden Beiträge von Chirs suchen Nehmen Sie Chirs in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Setze das Ergebnis auf 0.
Wenn das rechte (bzw. linke) Kind vorhanden ist, gibt es da schonmal eine Verzweigung, also muss diese zum Ergebnis addiert werden.
Hinzu kommen dann noch die Verzweigungen der Kinder selbst.

Das Ergebnis sollte um 1 kleiner sein, als die Anzahl der Knoten.

__________________
Syntax Highlighting fürs Board (Link)
11.01.2016 13:13 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Chirs
Mitglied


Dabei seit: 23.12.2015
Beiträge: 26

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Danke für den Tipp smile
Für den Vergleich mit den Knoten müsste ich aber jedoch eine zweite Rekursive Funktion schreiben, die die Anzahl der Konten zurück gibt.

ich hab jetzt fürs Erste diesen Ansatz erarbeitet:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
 int verzweigungen(textbaum *b)
{ if (b==NULL)
return;

else return 
{
1+(verzweigung(b->left)+verzweigung(b->right));

}          



Ich vermute allerdings, dass ich noch eine Variable n definieren soll und diese dann nach jedem Durchlauf zyklisch nach oben zählen sollte.
13.01.2016 14:48 Chirs ist offline E-Mail an Chirs senden Beiträge von Chirs suchen Nehmen Sie Chirs in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ich würde zwei Funktionen schreiben. Eine, die rekursiv die Anzahl der Knoten zählt (da muss man nichts abziehen) und eine zweite, die die erste aufruft und deren Ergebnis-1 zurückgibt.
Und deine 3. Zeile ist falsch, da du einen Rückgabewert brauchst.

__________________
Syntax Highlighting fürs Board (Link)
13.01.2016 16:59 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Chirs
Mitglied


Dabei seit: 23.12.2015
Beiträge: 26

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Danke für den Hinweiß hab die Null vergessen Augenzwinkern

Ja ich galube du hast recht so ist es eindeutig einfacher und besser


Grüße
14.01.2016 14:03 Chirs ist offline E-Mail an Chirs senden Beiträge von Chirs suchen Nehmen Sie Chirs in Ihre Freundesliste auf
Chirs
Mitglied


Dabei seit: 23.12.2015
Beiträge: 26

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Sry dass ich nochmal nachfrage aber was wäre denn z.B. wenn ich irgendwann mal so eine Prüfungsaufgabe bekommen würde. In der ich eine Funktion schreiben soll die die Verzweigungen in einem Baum zählt.

Könnte ich dann meine Funktion verwenden ?
15.01.2016 16:12 Chirs ist offline E-Mail an Chirs senden Beiträge von Chirs suchen Nehmen Sie Chirs in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Wenn dein Baum aus einem einzigen Knoten besteht, gibst du eine 1 zurück. Mit wem ist der Knoten denn verbunden?
So sollte es klappen:
code:
1:
2:
3:
result = (verzweigung(b->left)+verzweigung(b->right)); //Verzweigungen der Kinder zählen
if (b->left != NULL) result++; //Verzweigung zum linken Kind addieren
if (b->right != NULL) result++; //und zum rechten


__________________
Syntax Highlighting fürs Board (Link)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von eulerscheZahl: 15.01.2016 16:34.

15.01.2016 16:34 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Chirs
Mitglied


Dabei seit: 23.12.2015
Beiträge: 26

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Danke für den Denkanstoß smile
Leider darf ich es in der Prüfung nicht so wie du es programmiert hast machen.
Weißt du zufällig ob mein Code auch funktionieren würde ?
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
int verzweigungen(textbaum *b)
{
if (b==NULL)
return 0;

else if (b->left == NULL) && (b->right == NULL) 
return 1;

else return 1+(verzweigung(b->left)+verzweigung(b->right)); 

};
15.01.2016 17:04 Chirs ist offline E-Mail an Chirs senden Beiträge von Chirs suchen Nehmen Sie Chirs in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Stelle dir mal einen Baum mit 3 Knoten vor:
code:
1:
2:
3:
   a
  / \
 b   c

Für b und c wirst du jeweils 1 zurückgeben (Zeile 7).
Für a hast du also durch die rekursiven Aufrufe schon 2. Darauf addierst du noch 1, hast also 3. Ich zähle aber nur 2 Verbindungen.

__________________
Syntax Highlighting fürs Board (Link)
15.01.2016 17:11 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Chirs
Mitglied


Dabei seit: 23.12.2015
Beiträge: 26

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Stimmt du hast recht also muss ich die 1+.... weglassen dann müsste es funktionieren smile

Danke dir du hast mir sehr geholfen Daumen hoch
15.01.2016 17:45 Chirs ist offline E-Mail an Chirs senden Beiträge von Chirs suchen Nehmen Sie Chirs in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Habe nochmal drüber nachgedacht: jetzt scheiterst du nur noch, wenn der Baum ausschließlich aus dem Wurzelknoten besteht.

__________________
Syntax Highlighting fürs Board (Link)
16.01.2016 06:30 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Chirs
Mitglied


Dabei seit: 23.12.2015
Beiträge: 26

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ich habe auch nochmal darüber nachgedacht in der Zeile 10 muss eine ODER und kein UND stehen weil wenn es ein UND ist dann existiert in einem Baum nur die Wurzel und dann hat der Baum keinerlei Verzweigungen.

Ich habe jetzt den Terminierungsfall,wenn der Baum nur aus Wurzel besteht auch abgedeckt (Zeile 7). Da hier ja keine Verzeigungen auftreten.

Grüße.
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:

int verzweigungen(textbaum *b)
{
if (b==NULL)
return 0;

else if (b->left == NULL) && (b->right == NULL) 
return 0;

else if (b->left == NULL) || (b->right == NULL) 
return 1;

else return (verzweigung(b->left)+verzweigung(b->right));

16.01.2016 10:06 Chirs ist offline E-Mail an Chirs senden Beiträge von Chirs suchen Nehmen Sie Chirs in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Jetzt hat der Baum mit den 3 Knoten von oben ja gar keine Verzweigungen mehr geschockt
Ich komme mir langsam vor wie Captain Hindsight.

__________________
Syntax Highlighting fürs Board (Link)
16.01.2016 11:09 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Chirs
Mitglied


Dabei seit: 23.12.2015
Beiträge: 26

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Meine Terminierungsfälle sind doch:

Wenn b leer return 0
Wenn b->left oder b->right == NULL return 1

Aber wo ich noch nicht ganz durchgeblickt habe ist dass ich doch eigtl noch zwei weitere Terminierungsfälle habe und zwar wenn b->left und b->right !=0 sind es ja zwei Verzweigungen und wenn b->left und b->right = 0 habe ich keine Verzweigung.

Wie sollte ich es dann deiner Meinung nach aufbauen ?


Sry für die Anfängerfrage. Würde mich freuen wenn du mir weiterhelfen könntest.


Grüße
17.01.2016 17:41 Chirs ist offline E-Mail an Chirs senden Beiträge von Chirs suchen Nehmen Sie Chirs in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Es gibt 2 Terminierungsfälle:
Der Knoten selbst ist NULL oder BEIDE Kinder sind NULL (eins reicht nicht, damit kannst du immer noch eine Liste bauen). Wenn wir im 2. Fall trotzdem weitermachen, schadet das aber nicht: dann wird die Funktion mit NULL aufgerufen und wir sind wieder bei Fall 1 (der muss sowieso abgedeckt werden).

Was gibt es denn daran auszusetzen, dass du das nicht nehmen darfst?
code:
1:
2:
3:
4:
5:
if (b == NULL) return 0;
return verzweigung(b->left) + 
    verzweigung(b->right) + 
    (b->left == NULL)?0:1 + 
    (b->right == NULL)?0:1;


__________________
Syntax Highlighting fürs Board (Link)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von eulerscheZahl: 17.01.2016 17:49.

17.01.2016 17:48 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Seiten (2): [1] 2 nächste » Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Rekursiv Verzweigungen zählen in einem Baum