Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
--- Praktische Informatik (http://www.informatikerboard.de/board/board.php?boardid=6)
---- Algorithmen (http://www.informatikerboard.de/board/board.php?boardid=17)
----- Rekursives Suchen und Ersetzen in einem Baum (http://www.informatikerboard.de/board/thread.php?threadid=2704)


Geschrieben von Chirs am 23.12.2015 um 09:15:

  Rekursives Suchen und Ersetzen in einem Baum

Meine Frage:
Hallo zusammen,

Ich hätte eine Frage bezüglich einer Aufgabe die mir in meinem Studium gestellt wurde.

Die Aufgabe lautet:
Schreiben Sie eine Prozedur die in einem binären Baum alle Vorkommen eines bestimmten Kontenelements sucht und gegen ein anderes austauscht.

Vielleicht kennt sich ja hier einer mit dem Thema aus und kann mir weiterhelfen.

Das Ganze soll in C realisiert werden.

Vielen Dank schonmal für eure Hilfe :-)

Viele Grüße,

Christoph

Meine Ideen:
Ich versuche zusätzlich diese Aufgabe rekursiv zu lösen und sie vielleicht auf einen nicht binären Baum zu erweitern.

Meine Idee wäre, dass man Terminierungsfälle hat wie z.B.
if(x<b->wurzel&&b->left==x)
b->treeelement=z

Aber leider weiß ich nicht wie es für einen nicht binären Baum aussieht und ob dieser Ansatz richtig ist.



Geschrieben von eulerscheZahl am 23.12.2015 um 12:56:

 

Hast du schon Code zur Darstellung des Baums?
Weißt du, ob nur den Inhalt des Knotens getauscht werden soll, oder auch die Nachfolgerknoten sich ändern?



Geschrieben von Chirs am 23.12.2015 um 13:21:

 

Leider habe ich noch keinen Code der so einen Baum darstellt.

Es soll nur der Inhalt der Knoten ersetzt werden und das so lange bis der Inhalt im kompletten Baum vollständig ersetzt wurde.


lg



Geschrieben von eulerscheZahl am 23.12.2015 um 13:45:

 

Hast du an sowas gedacht?
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
#include <stdio.h>
#include <stdlib.h>

struct Node
{
	struct Node *right;
	struct Node *left;
	int value;
};

void printTree(struct Node* n, int depth)
{
	int i;
	if(n==NULL) return;
	printTree(n->right, depth+1);
	for(i=0;i<depth;i++) printf("     ");
	printf("%5d\n",n->value);
	printTree(n->left, depth+1);
}

void replace(struct Node* n, int old, int new) {
	if(n==NULL) return;
	replace(n->right, old, new);
	if (n->value == old) n->value = new;
	replace(n->left, old, new);
}

int main(void)
{
//Baum erstellen
	struct Node* root = (struct Node*)malloc(sizeof(struct Node));
	root->value = 1;
	struct Node* left = (struct Node*)malloc(sizeof(struct Node));
	left->value = 2;
	struct Node* right = (struct Node*)malloc(sizeof(struct Node));
	right->value = 3;
	root->left = left;
	root->right = right;
	struct Node* leftleft = (struct Node*)malloc(sizeof(struct Node));
	leftleft->value = 4;
	left->left = leftleft;
//Ausgabe zur Kontrolle
	printTree(root, 0);
//Ersetzen des Inhalts
	replace(root, 2, 5);
	replace(root, 3, 7);
	printf("\n\n");
//erneute Ausgabe
	printTree(root, 0);
}



Geschrieben von Chirs am 23.12.2015 um 14:05:

 

Ja genau an sowas. Danke dir!

Aber was ich noch nicht ganz verstehe ist warum du die Zeile:

replace(n->right, old, new);

vor der nächsten Bedingung aufrufst.


lg



Geschrieben von eulerscheZahl am 23.12.2015 um 14:18:

 

Die Reihenfolge ist egal, kannst sie gerne ändern.



Geschrieben von Chirs am 23.12.2015 um 14:22:

 

ok super.

Tausend Dank ! Daumen hoch


Forensoftware: Burning Board, entwickelt von WoltLab GmbH