MÄnga har nog försökt hitta strukturen för ett allmÀnt trÀd, men sökmotorn hittade bara binÀra... BinÀrt söktrÀd, traversering av binÀra trÀd och mÄnga andra algoritmer.
Ja, faktiskt, allmÀnt trÀd anvÀnds ingenstans, traverseringen Àr lÄngsam och anvÀndningsomrÄdena Àr smÄ.
SÄ, jag stÀllde mig frÄgan och kommer nu att förklara hur ett trÀd faktiskt byggs. SÄ, i idealfallet bör strukturen för ett allmÀnt trÀd lagra tre variabler:
- pekare till den Àldre sonen
- pekare till brodern
- data som du planerar att lagra
struct Tnode {
int key;
struct Tnode *son;
struct Tnode *brother;
};
typedef struct Tnode Node;
LÄt oss deklarera en pekare till roten:
Node *tree = NULL;Vi mÄste pÄ förhand komma överens om hur vi ska införa noder, det Àr ju inte ett binÀrt trÀd, och varje nod kan ha hur mÄnga söner som helst.
- + 2 (eller +ssbb 2) â infogning i trĂ€det (för det allmĂ€nna trĂ€det anges vĂ€gen som en strĂ€ng dĂ€r r skapar roten, s gĂ„r till den Ă€ldre sonen, b gĂ„r till brodern);
HÀr Àr ett exempel:
+r 1
+ 2
+ 3
+ 3
+s 5
+sb 6
+sb 7
Resultatet kommer att vara ett sÄdant trÀd:
1
2
5
3
6
7
3
Till att börja med skapar vi en funktion som lÀgger till en nod, det vill sÀga som allokerar minne för noden och ger en pekare till denna nod (som frÄn början inte Àr kopplad till nÄgot).
Node *create_tree(int v) {
Node *Tree = (Node *) malloc(sizeof(Node));
Tree->key = v;
// nollstÀller pekarna till bröder och söner, en oberoende nod som lagrar vÀrdet
Tree->son = NULL;
Tree->brother = NULL;
return Tree;
}
Det Ă€r ocksĂ„ nödvĂ€ndigt att skapa en funktion som behandlar strĂ€ngen för vĂ€gen (+bsâŠ). Varje gĂ„ng vi börjar traverseringen frĂ„n roten, om den inte Ă€r skapad, visar vi NULL (vi kan inte göra nĂ„got). Om noden inte finns, mĂ„ste vi skapa den. Vi gĂ„r till funktionen att skapa trĂ€det och fĂ„r en pekare till roten.
Observera att Node ** tree överför strukturen och kopierar inte. Detta ger oss möjlighet att förÀndra, vilket inte kan göras i motsats till deklarationen Node *tree.
I allmÀnhet mÄste vi hitta pekaren till noden, till vilken vi behöver lÀgga till en son:
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); // skapar roten
t = *tree;
return *tree;
}
if (a[i] == 's') {
if (t = to_son(t)) // funktion som returnerar pekare till sonen
continue;
return NULL; // annars NULL
}
if (a[i] == 'b') {
if (t = to_brother(t)) // returnerar pekare till brodern t
continue;
return NULL;
}
}
if (t->son != NULL) {
t = last_son(t); // vi har kommit till toppen, som vi ville
// och nu gÄr vi till dess sista son,
// för att lÀgga till i slutet av listan
t->brother = create_tree(value);
return t->brother;
}
else {// om det inte finns nÄgon son, skapar vi en
t->son = create_tree(value);
return t->son;
}
}
SÄ bygger vi ett trÀd.
P.S. Min första artikel, sÄ jag ber er att inte döma för hÄrt.
KĂ€lla: habr.com
