Betsaka ny olona no niezaka nitady fanamboarana hazo ankapobe, fa ny milina fikarohana dia tsy nahita afa-tsy ny binary... Hazo fikarohana binary, traversal hazo binary ary algorithms maro hafa.
Eny tokoa, ny hazo ankapobeny dia tsy ampiasaina na aiza na aiza, ny fandehanana miadana, ny fampiasana dia kely.
Noho izany, nanontany ny tenako ity fanontaniana ity aho ary ankehitriny dia hanazava ny fomba fananganana ilay hazo aho. Noho izany, ny tsara indrindra, ny firafitry ny hazo amin'ny ankapobeny dia tokony hitahiry karazany telo:
- fanondro ny lahimatoa
- tondro ho rahalahy
- ny data hotehirizinao
struct Tnode {
int key;
struct Tnode *son;
struct Tnode *brother;
};
typedef struct Tnode Node;
Andao hanambara tondro mankany amin'ny vertex:
Node *tree = NULL;
Tsy maintsy manaiky mialoha ny fomba hidirana amin'ny vertices isika; tsy hazo binary io, ary ny vertex tsirairay dia afaka manan-janaka maro araka izay irina.
- + 2 (na +ssbb 2) - fampidirana ao anaty hazo (ho an'ny hazo ankapobe, ny lalana dia omena amin'ny alΓ lan'ny tsipika, izay r dia ny famoronana faka, s dia fifindrana mankany amin'ny lahimatoa, b dia fifindrana mankany rahalahy);
MamelΓ ahy hanome ohatra anao:
+r 1
+ 2
+ 3
+ 3
+s 5
+sb 6
+sb 7
Ny vokatra dia ho hazo toy izao:
1
2
5
3
6
7
3
Voalohany, andeha isika hamorona fiasa izay manampy vertex, izany hoe, manome fahatsiarovana ho an'ny vertex ary mandefa tondro mankany amin'io vertex io (tsy mifandray amin'ny zavatra rehetra tamin'ny voalohany).
Node *create_tree(int v) {
Node *Tree = (Node *) malloc(sizeof(Node));
Tree->key = v;
//ΠΎΠ±Π½ΡΠ»ΡΠ΅ΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΊ Π±ΡΠ°ΡΡΡΠΌ ΠΈ ΡΡΠ½ΠΎΠ²ΡΡΠΌ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠ°Ρ Π²Π΅ΡΡΠΈΠ½Π°, ΠΊΠΎΡΠΎΡΠ°Ρ Ρ
ΡΠ°Π½ΠΈΡ value
Tree->son = NULL;
Tree->brother = NULL;
return Tree;
}
Mila mamorona fiasa izay mitantana ny tadin-dalana (+bs...) ihany koa ianao. Isaky ny manomboka ny traversal avy amin'ny fakany isika, raha tsy noforonina, dia mamoaka NULL (tsy afaka manao na inona na inona isika). Raha tsy misy vertex dia tsy maintsy mamorona azy isika. Mandehana any amin'ny asa famoronana hazo isika ary maka tondro mankany amin'ny fakany.
Mariho fa mandalo ny rafitra ny hazo Node** fa tsy mandika azy io. Izany dia manome antsika fahafahana hanova zavatra izay tsy azontsika atao amin'ny fanambarana hazo Node *.
Amin'ny ankapobeny dia tsy maintsy mahita tondro mankany amin'ny vertex izay ilaintsika ampiana ny zanaka:
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;
}
}
Toy izao ny fomba fanamboarana hazo.
P.S. ny lahatsoratro voalohany, ka aza mitsara mafy loatra
Source: www.habr.com