Eine Einführung in die Programmiersprache C und die Grundlagen ...
Eine Einführung in die Programmiersprache C und die Grundlagen ...
Eine Einführung in die Programmiersprache C und die Grundlagen ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>E<strong>in</strong>e</strong> <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> Informatik <strong>und</strong> <strong>die</strong> <strong>Programmiersprache</strong> C<br />
Das Löschen e<strong>in</strong>es Knotens ist deutlich komplizierter, <strong>in</strong>sbesondere wenn e<strong>in</strong> Knoten mit zwei<br />
Nachfolgern gelöscht werden soll, dann müssen beide Teilbäume <strong>die</strong>ses Knotens an der korrekten<br />
Stelle des Restbaumes e<strong>in</strong>gefügt werden. Bei Bäumen empfiehlt es sich deshalb besonders, auf bereits<br />
existierende (<strong>und</strong> gründlich getestete) Bibliotheken zurückzugreifen.<br />
/* Der Funktion muss <strong>die</strong> Addresse des Zeigers, der auf den zu löschenden */<br />
/* Knoten zeigt, übergeben werden. Dies ist nötig, weil eben<strong>die</strong>ser Zeiger */<br />
/* auch verändert werden muss. (Suchfunktion entsprechend ändern) */<br />
ParentPtr<br />
Zu löschendes<br />
Element<br />
ParentPtr<br />
gelöschtes<br />
Element<br />
void RemoveNode(TreeNode **ParentPtr) {<br />
TreeNode *Node = *ParentPtr;<br />
TreeNode *p, *p2;<br />
if(Node == NULL) {<br />
return; /* element not fo<strong>und</strong>; */<br />
} else {<br />
if((Node->left == NULL) && (Node->right == NULL)) {<br />
/* Knoten hat ke<strong>in</strong>e Nachfolger, e<strong>in</strong>fach entfernen */<br />
free(Node);<br />
*ParentPtr= NULL;<br />
}<br />
else if(Node->left==NULL) {<br />
/* Knoten hat e<strong>in</strong>en Nachfolger, e<strong>in</strong>fach bei Parent anhaengen */<br />
p = Node->right;<br />
free(Node);<br />
*ParentPtr= p;<br />
}<br />
else if(Node->right == NULL) {<br />
/* Knoten hat e<strong>in</strong>en Nachfolger, e<strong>in</strong>fach bei Parent anhaengen */<br />
p = Node->left;<br />
free(Node);<br />
*ParentPtr= p;<br />
else {<br />
/* hat zwei Nachfolger, zusammenfuegen <strong>und</strong> bei Parent anhaengen */<br />
p2 = Node->right;<br />
p = Node->right;<br />
/*Zusammenfügeposition suchen (wo l<strong>in</strong>ken Zweig <strong>in</strong> rechten e<strong>in</strong>fuegen)*/<br />
while(p->left) p = p->left;<br />
p->left = Node->left;<br />
free(Node);<br />
*ParentPtr= p2;<br />
}<br />
}<br />
}<br />
Bei b<strong>in</strong>ären Bäumen muss man darauf achten, dass sie nicht entarten (Viele Knoten haben nur e<strong>in</strong>en<br />
Nachfolger -> Baum wird zu e<strong>in</strong>er Liste). Um das zu verh<strong>in</strong>dern gibt es 'balanced Trees' (Ausgeglichene<br />
Bäume). Dabei wird bei jeder E<strong>in</strong>füge <strong>und</strong> Löschoperation durch Überprüfung der Baumstruktur<br />
<strong>und</strong> eventueller Umordnung des Baumes versucht, den Baum <strong>in</strong> e<strong>in</strong>er möglichst optimalen<br />
Form zu behalten.<br />
Es gibt noch viele weitere Abarten von Bäumen, e<strong>in</strong>ige davon haben auch mehr als zwei Nachfolger<br />
pro Knoten. Jede Variante hat ihre Vor- <strong>und</strong> Nachteile, welche jeweils gegene<strong>in</strong>ander abgewogen<br />
werden müssen.<br />
Gedruckt am 10.09.2009 14:23:00 Letzte Änderung am: 10. September 2009 Version 2.4.1, I. Oesch 113/147