Multi probabiliter conati sunt invenire constructionem arboris generalem, sed quaesitio machinae tantum inventa binaria... Arbor binaria, arbor binaria traversal et multa alia algorithms.
Imo vero communis arbor nullibi adhibetur, tarde traversal, exigui casus usus.
Ego igitur hanc quaestionem interrogavi et nunc quomodo arbor aedificata sit exponam. Ita, idealis structura, arbor generalis tres variabiles debet recondere;
- monstratorem primogenitum
- monstratorem fratrem
- in notitia tu properas ad reponunt
struct Tnode {
int key;
struct Tnode *son;
struct Tnode *brother;
};
typedef struct Tnode Node;
Eamus regulam ad verticem;
Node *tree = NULL;
Conveniunt ante vertices ingrediendi, haec arbor binaria non est, et quilibet vertex tot liberos habere potest quot desideratos.
- + 2 (vel +ssbb 2) - insertio in arborem (pro generali ligno, via datur per lineam, ubi r est radix creatio, s transitus ad filium maximum, b transitus ad. frater);
Exemplum demus vobis.
+r 1
+ 2
+ 3
+ 3
+s 5
+sb 6
+sb 7
Lignum sic erit:
1
2
5
3
6
7
3
Primum, faciamus functionem quae verticem addit, nempe memoriam ad verticem allatet et monstratorem huic vertex transeat (alicuius initio non connexum).
Node *create_tree(int v) {
Node *Tree = (Node *) malloc(sizeof(Node));
Tree->key = v;
//ΠΎΠ±Π½ΡΠ»ΡΠ΅ΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΊ Π±ΡΠ°ΡΡΡΠΌ ΠΈ ΡΡΠ½ΠΎΠ²ΡΡΠΌ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠ°Ρ Π²Π΅ΡΡΠΈΠ½Π°, ΠΊΠΎΡΠΎΡΠ°Ρ Ρ
ΡΠ°Π½ΠΈΡ value
Tree->son = NULL;
Tree->brother = NULL;
return Tree;
}
Etiam functionem creare debes quae tramitem chordae tractat (+bs...). Quoties ab radice committitur traversalis, si non creatur, nullas nos output (nihil possumus). Si vertex non est, creare oportet. Imus ad partum arboris munus et regulam ad radicem accipimus.
Nota quod Node arbor structuram praeterit, non describendo. Hoc nobis facultatem dat mutandi res quae cum declaratione Node *arboris facere non possumus.
In genere quaerendum est monstratorem ad verticem cui adiiciendum est filium;
Node* add_node(Node **tree, const char *a) {
Node* t = *tree;
int value;
scanf("%d", &value);
int i = 0;
while (a[++i] != ' ') {
if (a[i] == 'r') {
*tree = create_tree(value); // ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠΎΡΠ΅Π½Ρ
t = *tree;
return *tree;
}
if (a[i] == 's') {
if (t = to_son(t)) // ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½Π°
continue;
return NULL; //ΠΈΠ½Π°ΡΠ΅ NULL
}
if (a[i] == 'b') {
if (t = to_brother(t)) //Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π±ΡΠ°ΡΠ° t
continue;
return NULL;
}
}
if (t->son != NULL) {
t = last_son(t); // ΠΌΡ ΠΏΠ΅ΡΠ΅ΡΠ»ΠΈ ΠΊ Π²Π΅ΡΡΠΈΠ½Π΅, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΉ Ρ
ΠΎΡΠ΅Π»ΠΈ
//ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ ΠΈΠ΄Π΅ΠΌ ΠΊ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΌΡ Π΅Π΅ ΡΡΠ½Ρ,
//ΡΡΠΎΠ±Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΠΊΠΎΠ½Π΅Ρ ΡΠΏΠΈΡΠΊΠ°
t->brother = create_tree(value);
return t->brother;
}
else {//Π΅ΡΠ»ΠΈ ΡΡΠ½Π° Π½Π΅Ρ, ΡΠΎ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π΅Π³ΠΎ
t->son = create_tree(value);
return t->son;
}
}
Sic arborem edificamus.
P.S. primus articulus meus, ut placet non nimis aspere iudicare
Source: www.habr.com