30.11.2012 Aufrufe

Grundkurs Informatik Aufgabensammlung mit Lösungen Teil 3

Grundkurs Informatik Aufgabensammlung mit Lösungen Teil 3

Grundkurs Informatik Aufgabensammlung mit Lösungen Teil 3

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.

3-36 Aufgaben und <strong>Lösungen</strong><br />

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯<br />

}<br />

p=p->l; // weiter zum linken Nachfolger<br />

}<br />

p=s[t--]; // Knoten aus Stack holen<br />

}<br />

return 0;<br />

//------------------------------------------------------------------------<br />

// Einfügen eines Elementes in einen Binärbaum<br />

// Rückgabewert: 0 bei normaler Ausführung<br />

// -1 wenn nicht genug Speicher<br />

//------------------------------------------------------------------------<br />

int tree_in(struct node *root, int key) {<br />

int dir=0;<br />

struct node *p, *v=root, *k=root->l;<br />

p=node_init(key); // neuen Knoten erzeugen<br />

if(p==NULL) return -1; // nicht genug Speicher<br />

while(k) { // .. Einfügestelle suchen<br />

v=k; // Vorgänger<br />

if(keykey) {<br />

k=k->l; // Verzweige nach links<br />

dir=0; // Verzweigungsrichtung merken<br />

}<br />

else { // Verzweige nach rechts<br />

k=k->r;<br />

dir=1; // Verzweigungsrichtung merken<br />

}<br />

}<br />

if(dir) v->r=p; // Einfügen von p als rechten ..<br />

else v->l=p; // .. oder linken Nachfolger<br />

}<br />

//------------------------------------------------------------------------<br />

// Suchen eines Schlüssels key in einem Binärbaum<br />

// Rückgabewert: Anzahl der Schritte<br />

// -1 wenn nicht gefunden<br />

//------------------------------------------------------------------------<br />

int tree_search(struct node *root, int key) {<br />

int cnt=1;<br />

struct node *k=root->l; // Start <strong>mit</strong> der Wurzel<br />

while(k) { // Schlüssel key suchen<br />

if(k->key==key) return cnt; // Schlüssel gefunden<br />

else if(key < k->key) k=k->l; // gehe zum linken Nachfolger<br />

else k=k->r; // gehe zum rechten Nachfolger<br />

cnt++; // Schrittzähler inkrementieren<br />

}<br />

return -1; // nicht gefunden<br />

}<br />

//------------------------------------------------------------------------<br />

// Löschen eines Schlüssels key in einem Binärbaum<br />

// Rückgabewert: Anzahl der Schritte<br />

// -1 wenn nicht gefunden<br />

//------------------------------------------------------------------------<br />

int tree_del(struct node *root, int key) {<br />

int cnt=1, dir=0;<br />

struct node *v=root, *k=root->l; // Start <strong>mit</strong> der Wurzel<br />

struct node *s, *vs; // Symm. Vorgänger s und dessen Vorg.<br />

while(k) { // Schlüssel key suchen<br />

if(k->key==key) break; // Schlüssel gefunden<br />

v=k; // Vorgänger merken<br />

if(key < k->key) { // Schlüssel vergleichen<br />

k=k->l; // gehe zum linken Nachfolger

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!