Quand utiliser la pré-commande, le postender et l'inverse des stratégies de travers d'arbre de recherche binaire

StackOverflow https://stackoverflow.com/questions/9456937

Question

Je me suis rendu compte récemment que tout en faisant de nombreuses personnes de BST dans ma vie, je n'ai même jamais envisagé d'utiliser quoi que ce soit, mais que je suis au courant et que je sache et sachez à quel point il est facile d'adapter un programme d'utilisation pré / post-commandeTraverse).

En réalisant cela, j'ai sorti certaines de mes manuels d'anciens structures de données et avons cherché un raisonnement derrière l'utilité des travers de pré-commande et de post-commandes - ils n'ont pas beaucoup dit.

Quels sont quelques exemples de quand utiliser Preorder / Postard Pratiquement?Quand cela a-t-il plus de sens que dans l'ordre?

Était-ce utile?

La solution

Quand utiliser la stratégie Traversal pré-commandes, dans l'ordre et post-commande

Avant de pouvoir comprendre dans quelles circonstances utiliser pré-commandes, en ordre et post-commande pour un arbre binaire, vous devez comprendre exactement comment chaque stratégie de traversée fonctionne. Utilisez l'arborescence suivante à titre d'exemple.

La racine de l'arbre est 7 , la plupart des nœuds de gauche sont 0 , la bonne nœud est 10 . .

Entrez la description de l'image ici

Traversal de pré-commande :

Résumé: commence à la racine ( 7 ), se termine au niveau du nœud de la droite ( 10 )

Séquence Traverse: 7, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10

Traversal dans l'ordre :

Résumé: commence au nœud de gauche ( 0 ), se termine au nœud le plus à droite ( 10 )

séquence trershavation: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Traversal post-commander :

Résumé: commence par le nœud de gauche ( 0 ), se termine par la racine ( 7 )

Séquence Traverse: 0, 2, 4, 6, 5, 3, 1, 8, 10, 9, 7

Quand utiliser la pré-commande, la commande ou la post-commande?

Stratégie Traversal Le programmateur sélectionne dépend des besoins spécifiques de l'algorithme conçu. L'objectif est de la vitesse, alors choisissez la stratégie qui vous apporte les nœuds dont vous avez besoin le plus rapide.

  1. Si vous savez que vous devez explorer les racines avant d'inspecter les feuilles, vous choisissez Pré-commande parce que vous rencontrerez toutes les racines avant toutes les feuilles.

  2. Si vous savez que vous devez explorer toutes les feuilles avant tous les nœuds, vous sélectionnez post-commande parce que vous ne gaspillez pas de temps à inspecter des racines à la recherche de feuilles.

  3. Si vous savez que l'arborescence a une séquence inhérente dans les nœuds et que vous souhaitez aplatir l'arborescence 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éé. Une traversée de pré-commande ou de post-commande peut ne pas dérouler l'arbre dans la séquence qui a été utilisée pour la créer.

    Algorithmes récursives pour pré-commandes, en ordre et 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
    }
    

Autres conseils

Utilisation pré-commandes / dans l'ordre / post-commande: mots simples

Pré-commande: utilisé pour créer une copie de l'arbre Exemple: si vous souhaitez créer une réplique d'un arborescence et besoin de valeurs de nœuds dans une matrice et lorsque vous insérez ces valeurs de l'index 0 pour terminer dans un nouvel arbre, vous obtenez une réplique

dans l'ordre: : obtenir des valeurs de nœud dans l'ordre non croissant

post-commande: : lorsque vous souhaitez supprimer un arbre de la feuille à racine

Si je voulais simplement imprimer le format hiérarchique de l'arborescence dans un format linéaire, j'utiliserais probablement la traversée de pré-commande.Par exemple:

- ROOT
    - A
         - B
         - C
    - D
         - E
         - F
             - G

Pre- et post-Commander concernent respectivement les algorithmes récursives de haut en bas et de bas en haut.Si vous voulez écrire un algorithme récursif donné sur des arbres binaires de manière itérative, c'est ce que vous ferez essentiellement.

Observez en outre que les séquences avant et post-commandes Spécifiez complètement l'arborescence à la main, donnant un codage compact (pour les arbres clairsemés au moins).

Il y a des tonnes de places que vous voyez cette différence joue un rôle réel.

Un excellent, je soulignerai est dans la génération de code pour un compilateur. Considérons la déclaration:

x := y + 32

La façon dont vous généreriez du code pour cela est (naïvement, bien sûr) pour générer de premier code pour charger y dans un registre, en chargement 32 dans un registre, puis générant une instruction pour ajouter les deux. Parce que quelque chose doit être dans un registre avant de le manipuler (supposons que vous puissiez toujours faire des opérandes constants, mais quoi que ce soit), vous devez le faire de cette façon.

En général, les réponses que vous pouvez accéder à cette question résument essentiellement à cette question: la différence considérablement importante en cas de dépendance entre le traitement de différentes parties de la structure de données. Vous voyez cela lors de l'impression des éléments, lors de la génération de code (État externe fait la différence, vous pouvez également le voir monadiquement, bien sûr), ou lorsque vous effectuez d'autres types de calculs sur la structure impliquant des calculs en fonction des enfants en cours de traitement en premier lieu. .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top