Dans l'article précédent, j'ai dit l'algorithme de calendrier de traversée récursive (traverse la première racine (première séquence).
Résumez l'algorithme non réécursif de la première traversée.
1) Entrez la pile, principalement pour saisir le nœud de première pile, puis visitez ce nœud
2)
3) Le bon enfant du nœud IF est vrai, le transfert vers 1) continue de traverser, sinon le nœud actuel sera quitté et transféré au nœud parent traversant 1)
Regardez d'abord l'algorithme conforme à cette idée:
Copier le code du code comme suit:
Int preorderTaververSenonrcursiveEx (const bitree & t, int (* VisitNode) (données de télémtype)))
{{
if (t == null)
{{
Retour -1;
}
Bitnode * pbinode = t;
Sqstack S;
Initiation (& s);
Push (& s, (selectype) t);
Tandis que (! Isstackedy (s))
{{
Pendant que (pbinode)
{{
VisitNode (pbinode-> data);
if (pbinode! = t)
{{
Push (& s, (selectype) pbinode);
}
pbinode = pbinode-> lchild;
}
if (pbinode == null)
{{
Pop (& s, (selemtype *) & pbinode);
}
if (pbinode-> rchild == null)
{{
Pop (& s, (selemtype *) & pbinode);
}
pbinode = pbinode-> rchild;
}
Retour 0;
}
Remarque: 1) La structure de la pile est utilisée ici, et vous pouvez voir la pile stockée dans l'ordre de la structure ci-dessus
2) Lors de la sauvegarde du nœud ici, ce que j'enregistre est l'adresse du pointeur, c'est-à-dire l'adresse du nœud, la transformant en stockage int. . Pourquoi pensez-vous à l'utilisation des pointeurs?
L'algorithme ci-dessus est en fait faux! Pourquoi? Ici, j'ai vérifié longtemps. Parce que si la pile est vide après la pop, mais il y a toujours le bon arbre, il ne continuera pas. Lorsque l'arbre enfant gauche est vide, comme suit: comme suit:
Copier le code du code comme suit:
Int preorderTaverVersenonrcursive (const bitree & t, int (* VisitNode) (données de télémtype))
{{
if (t == null)
{{
Retour -1;
}
Bitnode * pbinode = t;
Sqstack S;
Initiation (& s);
Push (& s, (selectype) t);
Tandis que (! Isstackedy (s))
{{
GetTop (s, (selectype *) & pbinode);
Pendant que (pbinode)
{{
VisitNode (pbinode-> data);
pbinode = pbinode-> lchild;
Push (& s, (selectype) pbinode);
}
if (pbinode == null)
{{
Pop (& s, (selemtype *) & pbinode);
}
if (! isstackedy (s))
{{
Pop (& s, (selemtype *) & pbinode);
pbinode = pbinode-> rchild;
Push (& s, (selectype) pbinode);
}
}
Retour 0;
}
C'est le cas. Appuyez-le dans le nœud enfant droit, puis déterminez si l'enfant de gauche de l'arborescence droite est vide et continuez le cycle.
Il y a deux déchets ici: l'un consiste à pousser dans les nœuds de l'enfant vide pour entrer la pile, et l'autre est d'utiliser fréquemment GetTop pour obtenir l'élément supérieur de la pile
Retournez ici pour voir l'algorithme conçu en premier, où le nœud nul n'est pas enfoncé dans le pointeur nul ou l'enfant vide, mais il ne peut pas être complètement sorti. Null est null c'est tout, de sorte qu'il n'y aura pas d'embarras qui n'affichera pas le nœud de l'arborescence sous-trace droite, comme suit: comme suit:
Copier le code du code comme suit:
// Traversant non cerque à travers l'arbre binaire
Int preorderTaververSenonrcursiveEx (const bitree & t,
Int (* VisitNode) (données de télémtype))
{{
if (t == null)
{{
Retour -1;
}
Bitnode * pbinode = t;
Sqstack S;
Initiation (& s);
Push (& s, (selectype) t);
Tandis que (! IsStackedy (s) || pbinode) // La modification principale est cette phrase
{{
Pendant que (pbinode)
{{
VisitNode (pbinode-> data);
if (pbinode! = t)
{{
Push (& s, (selectype) pbinode);
}
pbinode = pbinode-> lchild;
}
if (pbinode == null)
{{
Pop (& s, (selemtype *) & pbinode);
}
if (pbinode-> rchild == null)
{{
Pop (& s, (selemtype *) & pbinode);
}
pbinode = pbinode-> rchild;
}
Retour 0;
}
Après la première boucle, il suffit de la boucle. Comme suit, testez l'arbre binaire dans la section précédente:
À l'heure actuelle, les données d'entrée sont toujours 12 34 0 0 78 0 0. Les résultats des tests sont les suivants:
--- Bitree ---
Veuillez saisir les données du nœud Bitree:
12
Veuillez saisir les données du nœud Bitree:
34
Veuillez saisir les données du nœud Bitree:
0
Veuillez saisir les données du nœud Bitree:
0
Veuillez saisir les données du nœud Bitree:
78
Veuillez saisir les données du nœud Bitree:
0
Veuillez saisir les données du nœud Bitree:
0
12 34 78
Cela ne suffit pas pour tester, regarder l'arbre binaire suivant
À l'heure actuelle, les données d'entrée doivent être: 12 34 24 0 0 0 0 0 0 78 37 0 0 0. Les résultats du test sont les suivants:
--- Bitree ---
Veuillez saisir les données du nœud Bitree:
12
Veuillez saisir les données du nœud Bitree:
34
Veuillez saisir les données du nœud Bitree:
vingt-quatre
Veuillez saisir les données du nœud Bitree:
0
Veuillez saisir les données du nœud Bitree:
0
Veuillez saisir les données du nœud Bitree:
50
Veuillez saisir les données du nœud Bitree:
0
Veuillez saisir les données du nœud Bitree:
0
Veuillez saisir les données du nœud Bitree:
78
Veuillez saisir les données du nœud Bitree:
37
Veuillez saisir les données du nœud Bitree:
0
Veuillez saisir les données du nœud Bitree:
0
Veuillez saisir les données du nœud Bitree:
0
12 34 24 50 78 37
Il peut être vu à partir de la traversée préliminaire qu'elle est correcte. , puis l'ajouter pour le rejoindre.