Quand utiliser la stratégie de traversée des précommandes, des commandes et des post-commandes
Avant de pouvoir comprendre dans quelles circonstances utiliser la pré-commande, dans l'ordre et la post-commande pour un arbre binaire, vous devez comprendre exactement comment fonctionne chaque stratégie de traversée. Utilisez l'arborescence suivante comme exemple.
La racine de l'arbre est 7 , le nœud le plus à gauche est 0 , le nœud le plus à droite est 10 .
Parcours de précommande :
Résumé: commence à la racine ( 7 ), se termine au nœud le plus à droite ( 10 )
Séquence de traversée: 7, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10
Traversée dans l'ordre :
Résumé: commence au nœud le plus à gauche ( 0 ), se termine au nœud le plus à droite ( 10 )
Séquence de traversée: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Traversée post-commande :
Résumé: commence par le nœud le plus à gauche ( 0 ), se termine par la racine ( 7 )
Séquence de traversée: 0, 2, 4, 6, 5, 3, 1, 8, 10, 9, 7
Quand utiliser la pré-commande, la commande ou la post-commande?
La stratégie de traversée choisie par le programmeur dépend des besoins spécifiques de l'algorithme en cours de conception. L'objectif est la vitesse, alors choisissez la stratégie qui vous apporte les nœuds dont vous avez besoin le plus rapidement.
Si vous savez que vous devez explorer les racines avant d'inspecter les feuilles, vous choisissez la précommande car vous rencontrerez toutes les racines avant toutes les feuilles.
Si vous savez que vous devez explorer toutes les feuilles avant les nœuds, vous sélectionnez la post-commande car vous ne perdez pas de temps à inspecter les racines à la recherche de feuilles.
Si vous savez que l'arborescence a une séquence inhérente dans les nœuds et que vous souhaitez l'aplatir dans sa séquence d'origine, une traversée dans l'ordre doit être utilisée. L'arbre serait aplati de la même manière qu'il a été créé. Un parcours de pré-commande ou de post-ordre peut ne pas dérouler l'arborescence dans la séquence qui a été utilisée pour le créer.
Algorithmes récursifs pour la pré-commande, la commande et la post-commande (C ++):
struct Node{
int data;
Node *left, *right;
};
void preOrderPrint(Node *root)
{
print(root->name); //record root
if (root->left != NULL) preOrderPrint(root->left); //traverse left if exists
if (root->right != NULL) preOrderPrint(root->right);//traverse right if exists
}
void inOrderPrint(Node *root)
{
if (root.left != NULL) inOrderPrint(root->left); //traverse left if exists
print(root->name); //record root
if (root.right != NULL) inOrderPrint(root->right); //traverse right if exists
}
void postOrderPrint(Node *root)
{
if (root->left != NULL) postOrderPrint(root->left); //traverse left if exists
if (root->right != NULL) postOrderPrint(root->right);//traverse right if exists
print(root->name); //record root
}