So möchten Sie einen vollständigen binären Baum von einer bestimmten Tiefe unter Verwendung einer Schleife erstellen. Das ist möglich. Aber Sie sollten zuerst die Antwort von PaulColdrey in Betracht ziehen, da es ein bisschen einfacher ist.
Um einen Binärbaum iterativ zu erstellen, muss man wissen, dass sein jeder Knoten eindeutig mit einem Bitvektor identifiziert werden:
layer 0: ___________________[0]___________________
| |
layer 1: ________[00]________ ________[10]________
| | | |
layer 2: ___[000]___ ___[100]___ ___[010]___ ___[110]___
| | | | | | | |
layer 3: [0000] [1000] [0100] [1100] [0010] [1010] [0110] [1110]
A Bit auf N-ten Position teilt den Zweig (links: 0/rechts: 1) wurde genommen, wenn von (N - 1) -te Schicht zu Nth gegangen wird. Mit anderen Worten, ein Bitvektor ist ein Pfad zu dem Knoten; siehe oben.
Es reicht aus, von 0 bis 2 K - 1 zu zählen, um alle möglichen Pfade zu Kth-Schichtknoten zu erhalten. Und darüber hinaus würde das N-te Bit beim Hochzählen niemals von 0 auf 1 wechseln, bis alle weniger signifikanten Bits von 0 auf 1 wechseln - was in diesem Fall bedeutet, dass der aktuelle N-te Schicht-Teilbaum voll ist.
Dies ermöglicht, nur einen aktuellen Knoten pro Layer zu speichern und alle untergeordneten Elemente neu zu erstellen, wenn sich ein übergeordneter Knoten ändert. Diese
ist, wie es aussieht, ist in C:
struct NODE {
struct NODE *side[2];
double data;
};
struct NODE *fulltree(int depth) {
struct NODE *curr[16] = {};
int path, layer;
if ((depth >= 0) && (depth < 16)) { /** reject exceedingly large trees **/
curr[0] = (struct NODE*)calloc(1, sizeof(struct NODE));
for (path = 0; path < (1 << depth); ++path)
for (layer = 1; layer <= depth; ++layer)
if (((path^(path - 1)) >> (depth - layer)) & 1) {
curr[layer - 1]->side[(path >> (depth - layer)) & 1] =
curr[layer] = (struct NODE*)calloc(1, sizeof(struct NODE));
curr[layer]->data =
((path >> (layer - 1)) & 1)? layer : -layer;
}
}
return curr[0];
}
Der Code geht davon aus, dass negative Zahlen auf dem Ziel-CPU sind two`s complement.
Sehen Sie sich die Baumdurchsuchung vor, nach der Bestellung und in der Reihenfolge an. Das sollte dich in die richtige Richtung weisen. – nobism
Mögliches Duplikat des [Binary Tree Insert Algorithmus] (http://stackoverflow.com/questions/16630823/binary-tree-insert-algorithm) –
Hinweis: Array-Indizes sind von 0 bis n-1. Also: 'für (int i = 0; i <5; i ++) ...' –