06.10.2013 Aufrufe

Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke

Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke

Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<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 11.09.2008 13:04:00 Letzte Änderung am: 11. September 2008 Version 2.4, I. Oesch 113/147

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!