#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Baum
{
int zahl;
struct Baum *links, *rechts;
};
void einsort(struct Baum *wurzel, struct Baum *zgr);
void LWR(struct Baum *zgr);
int nodecount(struct Baum *zgr);
void printTreeLevel(struct Baum *zgr, int, int);
void printLevelorder(struct Baum *zgr);
int main(void)
{
struct Baum *wurzel = NULL;
struct Baum *zgr;
int zahl;
do
{
if (zahl)
{
zgr
= calloc(1,sizeof*zgr
); // neues element angelegt zgr->zahl = zahl; // Element mit Wert von Zahl befüllt
//zgr->links = zgr->rechts = NULL; // Zeiger des Elementes werden auf NULL gesetzt, dass ein Ende gefunden werden kann
if (wurzel == NULL) wurzel = zgr;
else einsort(wurzel, zgr); // Element soll über die Funktion einsort einsortiert werden
}
} while (zahl);
LWR(wurzel);
printf("\n\nnodes: %d\n\n", nodecount
(wurzel
)); printLevelorder(wurzel);
return 0;
}
void einsort(struct Baum *wurzel, struct Baum *zgr)
{
int flag = 1;
do
{
if (zgr->zahl < wurzel->zahl)
{
if (wurzel->links != 0) wurzel = wurzel->links; // gehe nach links
else
{
flag = 0;
wurzel->links = zgr;
}
}
else
{
if (wurzel->rechts != 0) wurzel = wurzel->rechts; // gehe nach rechts
else
{
flag = 0;
wurzel->rechts = zgr;
}
}
} while (flag);
}
void LWR(struct Baum *zgr) // Links Wurzel Rechts - aufsteigend sortiert
{
if (zgr == NULL)
return;
if (zgr->links != NULL) LWR(zgr->links);
if (zgr->rechts != NULL) LWR(zgr->rechts);
}
// Zählen der Knoten im Baum
int nodecount(struct Baum *zgr)
{
if (zgr == NULL)
return 0;
if (zgr->links == NULL && zgr->rechts == NULL)
return 1;
else
return nodecount(zgr->links) +
nodecount(zgr->rechts);
}
#define MAXX(x,y) ((x)>(y)?(x):(y))
int maxTreeDepth(struct Baum *zgr, int level)
{
if (zgr == NULL)
return 0;
if (zgr->links == NULL && zgr->rechts == NULL)
return level;
return MAXX(maxTreeDepth(zgr->links, level + 1), maxTreeDepth(zgr->rechts, level + 1));
}
// Alle Knoten einer Stufe ermitteln
void printTreeLevel(struct Baum *zgr, int level, int zlevel)
{
if (zgr == NULL)
return;
if (level == zlevel)
{
return;
}
else
{
printTreeLevel(zgr->links, level + 1, zlevel);
printTreeLevel(zgr->rechts, level + 1, zlevel);
}
}
// Traversierung in Levelorder
void printLevelorder(struct Baum *zgr)
{
int i, j = maxTreeDepth(zgr, 0);
for (i
= 0; i
<= j
; ++i
, puts("")) printTreeLevel(zgr, 0, i) ;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkbGliLmg+CiNpbmNsdWRlPHN0cmluZy5oPgoKc3RydWN0IEJhdW0KewogIGludCB6YWhsOwogIHN0cnVjdCBCYXVtICpsaW5rcywgKnJlY2h0czsKfTsKCnZvaWQgZWluc29ydChzdHJ1Y3QgQmF1bSAqd3VyemVsLCBzdHJ1Y3QgQmF1bSAqemdyKTsKdm9pZCBMV1Ioc3RydWN0IEJhdW0gKnpncik7CmludCBub2RlY291bnQoc3RydWN0IEJhdW0gKnpncik7CnZvaWQgcHJpbnRUcmVlTGV2ZWwoc3RydWN0IEJhdW0gKnpnciwgaW50LCBpbnQpOwp2b2lkIHByaW50TGV2ZWxvcmRlcihzdHJ1Y3QgQmF1bSAqemdyKTsKCmludCBtYWluKHZvaWQpCnsKICBzdHJ1Y3QgQmF1bSAqd3VyemVsID0gTlVMTDsKICBzdHJ1Y3QgQmF1bSAqemdyOwogIGludCB6YWhsOwoKICBkbwogIHsKICAgIHByaW50ZigiRWluZ2FiZTogIik7CiAgICBzY2FuZigiJWQiLCAmemFobCk7CiAgICBpZiAoemFobCkKICAgIHsKICAgICAgemdyID0gY2FsbG9jKDEsc2l6ZW9mKnpncik7IC8vIG5ldWVzIGVsZW1lbnQgYW5nZWxlZ3QKICAgICAgemdyLT56YWhsID0gemFobDsgLy8gRWxlbWVudCBtaXQgV2VydCB2b24gWmFobCBiZWbDvGxsdAogICAgICAvL3pnci0+bGlua3MgPSB6Z3ItPnJlY2h0cyA9IE5VTEw7IC8vIFplaWdlciBkZXMgRWxlbWVudGVzIHdlcmRlbiBhdWYgTlVMTCBnZXNldHp0LCBkYXNzIGVpbiBFbmRlIGdlZnVuZGVuIHdlcmRlbiBrYW5uCiAgICAgIGlmICh3dXJ6ZWwgPT0gTlVMTCkgd3VyemVsID0gemdyOwogICAgICBlbHNlIGVpbnNvcnQod3VyemVsLCB6Z3IpOyAvLyBFbGVtZW50IHNvbGwgw7xiZXIgZGllIEZ1bmt0aW9uIGVpbnNvcnQgZWluc29ydGllcnQgd2VyZGVuCgogICAgfQogIH0gd2hpbGUgKHphaGwpOwogIExXUih3dXJ6ZWwpOwogIHByaW50ZigiXG5cbm5vZGVzOiAlZFxuXG4iLCBub2RlY291bnQod3VyemVsKSk7CiAgcHJpbnRMZXZlbG9yZGVyKHd1cnplbCk7CgoKICBwcmludGYoIlxuIik7CgoKICByZXR1cm4gMDsKfQoKCnZvaWQgZWluc29ydChzdHJ1Y3QgQmF1bSAqd3VyemVsLCBzdHJ1Y3QgQmF1bSAqemdyKQp7CiAgaW50IGZsYWcgPSAxOwogIGRvCiAgewogICAgaWYgKHpnci0+emFobCA8IHd1cnplbC0+emFobCkKICAgIHsKICAgICAgaWYgKHd1cnplbC0+bGlua3MgIT0gMCkgd3VyemVsID0gd3VyemVsLT5saW5rczsgLy8gZ2VoZSBuYWNoIGxpbmtzCiAgICAgIGVsc2UKICAgICAgewogICAgICAgIGZsYWcgPSAwOwogICAgICAgIHd1cnplbC0+bGlua3MgPSB6Z3I7CiAgICAgIH0KCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGlmICh3dXJ6ZWwtPnJlY2h0cyAhPSAwKSB3dXJ6ZWwgPSB3dXJ6ZWwtPnJlY2h0czsgLy8gZ2VoZSBuYWNoIHJlY2h0cwogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBmbGFnID0gMDsKICAgICAgICB3dXJ6ZWwtPnJlY2h0cyA9IHpncjsKICAgICAgfQogICAgfQoKICB9IHdoaWxlIChmbGFnKTsKCgp9Cgp2b2lkIExXUihzdHJ1Y3QgQmF1bSAqemdyKSAvLyBMaW5rcyBXdXJ6ZWwgUmVjaHRzIC0gYXVmc3RlaWdlbmQgc29ydGllcnQKewogIGlmICh6Z3IgPT0gTlVMTCkKICAgIHJldHVybjsKICBpZiAoemdyLT5saW5rcyAhPSBOVUxMKSBMV1IoemdyLT5saW5rcyk7CiAgcHJpbnRmKCIgJWQiLCB6Z3ItPnphaGwpOwogIGlmICh6Z3ItPnJlY2h0cyAhPSBOVUxMKSBMV1IoemdyLT5yZWNodHMpOwp9CgovLyBaw6RobGVuIGRlciBLbm90ZW4gaW0gQmF1bQppbnQgbm9kZWNvdW50KHN0cnVjdCBCYXVtICp6Z3IpCnsKICBpZiAoemdyID09IE5VTEwpCiAgICByZXR1cm4gMDsKICBpZiAoemdyLT5saW5rcyA9PSBOVUxMICYmIHpnci0+cmVjaHRzID09IE5VTEwpCiAgICByZXR1cm4gMTsKICBlbHNlCiAgICByZXR1cm4gbm9kZWNvdW50KHpnci0+bGlua3MpICsKICAgIG5vZGVjb3VudCh6Z3ItPnJlY2h0cyk7Cn0KCiNkZWZpbmUgTUFYWCh4LHkpICgoeCk+KHkpPyh4KTooeSkpCmludCBtYXhUcmVlRGVwdGgoc3RydWN0IEJhdW0gKnpnciwgaW50IGxldmVsKQp7CiAgaWYgKHpnciA9PSBOVUxMKQogICAgcmV0dXJuIDA7CgogIGlmICh6Z3ItPmxpbmtzID09IE5VTEwgJiYgemdyLT5yZWNodHMgPT0gTlVMTCkKICAgIHJldHVybiBsZXZlbDsKCiAgcmV0dXJuIE1BWFgobWF4VHJlZURlcHRoKHpnci0+bGlua3MsIGxldmVsICsgMSksIG1heFRyZWVEZXB0aCh6Z3ItPnJlY2h0cywgbGV2ZWwgKyAxKSk7Cn0KCi8vIEFsbGUgS25vdGVuIGVpbmVyIFN0dWZlIGVybWl0dGVsbgp2b2lkIHByaW50VHJlZUxldmVsKHN0cnVjdCBCYXVtICp6Z3IsIGludCBsZXZlbCwgaW50IHpsZXZlbCkKewogIGlmICh6Z3IgPT0gTlVMTCkKICAgIHJldHVybjsKICBpZiAobGV2ZWwgPT0gemxldmVsKQogIHsKICAgIHByaW50ZigiJWQgIiwgemdyLT56YWhsKTsKICAgIHJldHVybjsKICB9CiAgZWxzZQogIHsKICAgIHByaW50VHJlZUxldmVsKHpnci0+bGlua3MsIGxldmVsICsgMSwgemxldmVsKTsKICAgIHByaW50VHJlZUxldmVsKHpnci0+cmVjaHRzLCBsZXZlbCArIDEsIHpsZXZlbCk7CiAgfQp9CgovLyBUcmF2ZXJzaWVydW5nIGluIExldmVsb3JkZXIKdm9pZCBwcmludExldmVsb3JkZXIoc3RydWN0IEJhdW0gKnpncikKewogIGludCBpLCBqID0gbWF4VHJlZURlcHRoKHpnciwgMCk7CiAgZm9yIChpID0gMDsgaSA8PSBqOyArK2ksIHB1dHMoIiIpKQogICAgcHJpbnRUcmVlTGV2ZWwoemdyLCAwLCBpKSA7Cn0KCgo=