Jende asko saiatu zen ziurrenik zuhaitzaren eraikuntza orokor bat aurkitzen, baina bilatzaileak bitarrak baino ez zituen aurkitu... Bilaketa-zuhaitz bitarra, zuhaitz bitarra zeharkatzea eta beste hainbat algoritmo.
Bai, egia esan, zuhaitz orokorra ez da inon erabiltzen, zeharkaldia motela da, erabilera kasuak txikiak dira.
Beraz, galdera hau egin nion neure buruari eta orain zuhaitza nola eraikitzen den azalduko dut. Beraz, hobe da zuhaitz-egitura orokor batek hiru aldagai gorde beharko lituzke:
- seme zaharrenaren erakuslea
- anaiaren erakuslea
- gordeko dituzun datuak
struct Tnode {
int key;
struct Tnode *son;
struct Tnode *brother;
};
typedef struct Tnode Node;
Adieraz dezagun erpinaren erakuslea:
Node *tree = NULL;
Aldez aurretik adostu behar dugu erpinak nola sartu; hau ez da zuhaitz bitarra, eta erpin bakoitzak nahi adina seme-alaba izan ditzake.
- + 2 (edo +ssbb 2) - zuhaitz batean txertatzea (zuhaitz orokor baterako, bidea lerroak ematen du, non r erro baten sorrera den, s seme zaharrenaren trantsizioa den, b trantsizio bat den anaia bat);
Adibide bat jartzen dizut:
+r 1
+ 2
+ 3
+ 3
+s 5
+sb 6
+sb 7
Emaitza honelako zuhaitza izango da:
1
2
5
3
6
7
3
Lehenik eta behin, sor dezagun erpin bat gehitzen duen funtzio bat, hots, erpinari memoria esleitzen dion eta erakusle bat pasatzen dion erpin honi (hasieran ez dago ezer lotuta).
Node *create_tree(int v) {
Node *Tree = (Node *) malloc(sizeof(Node));
Tree->key = v;
//ΠΎΠ±Π½ΡΠ»ΡΠ΅ΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΊ Π±ΡΠ°ΡΡΡΠΌ ΠΈ ΡΡΠ½ΠΎΠ²ΡΡΠΌ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠ°Ρ Π²Π΅ΡΡΠΈΠ½Π°, ΠΊΠΎΡΠΎΡΠ°Ρ Ρ
ΡΠ°Π½ΠΈΡ value
Tree->son = NULL;
Tree->brother = NULL;
return Tree;
}
Bide-katea (+bs...) kudeatzen duen funtzio bat ere sortu behar duzu. Errotik zeharkatzea hasten dugun bakoitzean, sortzen ez bada, NULL ateratzen dugu (ezin dugu ezer egin). Erpinik ez badago, orduan sortu behar dugu. Sortu zuhaitz funtziora joango gara eta errora erakuslea lortuko dugu.
Kontuan izan Node** zuhaitza egitura pasatzen ari dela, ez kopiatzen. Honek Node *zuhaitz deklarazioarekin egin ezin ditugun gauzak aldatzeko gaitasuna ematen digu.
Oro har, semea gehitu behar diogun erpinaren erakusle bat aurkitu behar dugu:
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;
}
}
Horrela eraikitzen dugu zuhaitz bat.
PS hau da nire lehen artikulua, beraz, mesedez, ez epaitu gogorregi
Iturria: www.habr.com