Traversal d\'arbre

Dans le de l'informatique, l'arbre-traversal se rapporte au processus de visiter chaque noeud dans une structure de données d'arbre , exactement une fois, d'une manière systématique. De tels traversals sont classifiés par l'ordre dans lequel les noeuds sont visités. Les algorithmes suivants sont décrits pour un arbre binaire , mais ils peuvent être aussi bien généralisés à d'autres arbres.

Méthodes de Traversal

Comparé aux structures de données linéaires comme les listes chaînées et les rangées unidimensionnelles , qui ont les moyens seulement un logiques du traversal, des structures arborescentes peuvent être traversées de beaucoup de différentes manières. Commencent à la racine d'un arbre binaire, là trois étapes principales qui peuvent être exécutées et l'ordre dans lequel elles sont exécutées définissent le type de traversal. Ces étapes sont : Effectuer une action sur le noeud courant (désigné sous le nom du " ; visiting" ; le noeud) ; ou la répétition du processus avec les sous-arbres s'est enracinée à nos enfants gauches et droits. Ainsi le processus le plus facilement est décrit par la récursion .

Pour traverser un arbre binaire non vide dans le preorder , effectuent les opérations suivantes : Visiter la racine.

  • Traverser le sous-arbre gauche.
  • Traverser le sous-arbre droit. (Ceci s'appelle également le Profondeur-premier traversal .)

    Pour traverser un arbre binaire non vide dans l'inorder , effectuer les opérations suivantes : Traverser le sous-arbre gauche.

  • Visiter la racine.
  • Traverser le sous-arbre droit.

    Pour traverser un arbre binaire non vide dans la priorité "après" , effectuer les opérations suivantes : Traverser le sous-arbre gauche.

  • Traverser le sous-arbre droit.
  • Visiter la racine.

    En conclusion, des arbres peuvent également être traversés dans le niveau-ordre , où nous visitons chaque noeud à un niveau avant d'aller à un niveau plus bas. Ceci s'appelle également le le traversal en largeur .

    Exemple

    Réalisations d'échantillon

    le preorder (le noeud) copie node.value si la nulle alors de ≠ de node.left) si la nulle alors de ≠ de node.right)

    inorder (noeud) de s'inorder de la nulle puis de ≠ de node.value s'inorder de la nulle puis de ≠ de node.right)

    priorité "après" (noeud) de si priorité "après" de la nulle puis de ≠ de node.left) si priorité "après" de la nulle puis de ≠ de node.value

    Chacune des trois réalisations d'échantillon exigera l'espace de pile proportionnel à la taille de l'arbre. Dans un arbre mal équilibré, ceci peut être tout à fait considérable.

    Nous pouvons enlever la condition de pile en maintenant des indicateurs de parent dans chaque noeud, ou par le filetant l'arbre . Dans le cas d'employer des fils, ceci tiendra compte du traversal considérablement amélioré d'inorder, bien que recherchant le parent que le noeud exigé pour preorder et le traversal de priorité "après" sera plus lent qu'un algorithme basé par pile simple.

    Pour traverser un a fileté l'inorder d'arbre de , nous a pu faire n'importe quoi de pareil :

    inorder (noeud) de tandis que le hasleftchild de (noeud) font noeud = node.left le font visite (noeud) si (hasrightchild (noeud)) puis noeud = node.right tandis que le hasleftchild de (noeud) font noeud = node.left d'autre noeud = node.right tandis que nulle de ≠ de noeud de

    Noter qu'un arbre binaire fileté fournira des moyens de déterminer si un indicateur est un enfant, ou d'un fil. Voir les arbres binaires filetés par pour plus d'information.

    Traversal de niveau d'ordre

    Le traversal de niveau d'ordre est une méthode de traversal par laquelle des niveaux sont commencer successivement visité par le niveau 0 (le noeud de racine), et des noeuds sont visités de gauche vers la droite à chaque niveau.

    Ceci est généralement mis en application using une structure de données de file d'attente avec les étapes suivantes (et employer l'arbre ci-dessous comme exemple) :

    Étape 1 : Pousser le noeud de racine sur la file d'attente (noeud 2) : Nouvelle file d'attente : 2 - - - - - - - - - -

    Step 2 :

    Bruit de le noeud outre de l'avant de la file d'attente (noeud 2).

    L'enfant gauche de ce noeud de poussée sur la file d'attente (noeud 7).

    L'enfant droit de ce noeud de poussée sur la file d'attente (noeud 5).

    produit que la valeur du noeud (2).

    Nouvelle file d'attente : 7-5- - - - - - - - - Rendement : 2

    Étape 3 :

    Bruit de le noeud outre de l'avant de la file d'attente (noeud 7).

    L'enfant gauche de ce noeud de poussée sur la file d'attente (noeud 2).

    L'enfant droit de ce noeud de poussée sur la file d'attente (noeud 6). produit que la valeur (7). du noeud

    Nouvelle file d'attente : 5-2-6- - - - - - - - Rendement : 2 7

    Étape 4 :

    Bruit de le noeud outre de l'avant de la file d'attente (noeud 5). L'enfant gauche du noeud de poussée de qui sur la file d'attente (la NULLE, ainsi ne prennent aucune mesure). L'enfant droit de ce noeud de poussée sur la file d'attente (noeud 9). produit que la valeur (5). du noeud

    Nouvelle file d'attente : 2-6-9- - - - - - - - Rendement : 2 7 5

    Étape 5 :

    Bruit de le noeud outre de l'avant de la file d'attente (noeud 2).

    L'enfant gauche du noeud de poussée de qui sur la file d'attente (la NULLE, ainsi ne prennent aucune mesure).

    L'enfant droit du noeud de poussée de qui sur la file d'attente (la NULLE, ainsi ne prennent aucune mesure).

    produit que la valeur du noeud (2).

    Nouvelle file d'attente : 6-9- - - - - - - - - Rendement : 2 7 5 2

    Étape 6 :

    Pop le noeud outre de l'avant de la file d'attente (noeud 6).

    L'enfant gauche de ce noeud de poussée sur la file d'attente (noeud 5).

    L'enfant droit de ce noeud de poussée sur la file d'attente (noeud 11).

    produit que la valeur (6). du noeud

    Nouvelle file d'attente : 9-5-11- - - - - - - - Rendement : 2 7 5 2 6

    Étape 7 :

    Pop le noeud outre de l'avant de la file d'attente (noeud 9).

    L'enfant gauche de ce noeud de poussée sur la file d'attente (noeud 4).

    L'enfant droit du noeud de poussée de qui sur la file d'attente (la NULLE, ainsi ne prennent aucune mesure).

    produit que la valeur (9). du noeud

    Nouvelle file d'attente : 5-11-4- - - - - - - - Rendement : 2 7 5 2 6 9

    Step 8 : Vous noterez que parce que les noeuds restants dans la file d'attente n'ont aucun enfant, rien d'autre sera ajouté à la file d'attente, ainsi les noeuds juste seront sautés au loin et rendement consécutivement (5, 11, 4). Ceci donne ce qui suit :

    Rendement final : 2 7 5 2 6 9 5 11 4

    ce qui est un traversal de niveau-ordre de l'arbre.

    traversal de niveau File d'attente-basé d'ordre

    En outre, énuméré ci-dessous est le pseudo-code pour un traversal de niveau simple d'ordre basé par de file d'attente de , et exigera l'espace proportionnel au nombre maximum des noeuds à une profondeur donnée. Ceci peut être autant que tout le nombre de noeuds/2. Une approche espace-efficace pour ce type de traversal peut être mise en application using recherche de approfondissement itérative une profondeur-première.

    levelorder (racine) de q = file d'attente vide q.enqueue (racine) tandis que le de pas q.empty font noeud : = q.dequeue () visite (noeud) si nulle de ≠ de node.left) si nulle de ≠ de node.right)

    Utilisations

    Traversal d'Inorder de

    Il est particulièrement commun pour employer un traversal d'inorder sur un arbre de recherche binaire parce que ceci renverra des valeurs de l'ensemble étant à la base dans l'ordre, selon le comparateur qui installent l'arbre de recherche binaire (par conséquent le nom).

    Pour voir pourquoi c'est le cas, noter que si le n est un noeud dans un arbre de recherche binaire, puis tout dans le sous-arbre droit de s du n 'sous-arbre laissé par s est moins que le n , et tout dans le n 'est supérieur ou égal à le n . Ainsi, si nous visitons le sous-arbre gauche dans l'ordre, using un appel récursif, et puis visitons le n , et puis visitons le sous-arbre droit dans l'ordre, nous ont visité le sous-arbre entier enraciné au n dans l'ordre. Nous pouvons supposer que les appels récursifs visitent correctement les sous-arbres dans l'ordre using le principe mathématique de l'induction structurale . La traversée dans l'inorder d'inverse de donne pareillement les valeurs par ordre décroissant.

    Le Preorder le traversal

    En traversant un arbre preorder dedans tandis que l'insertion des valeurs dans un nouvel arbre est manière commune de tirer une copie complète de d'un arbre de recherche binaire .

    On peut également employer preorder des traversals pour obtenir une expression de préfixe ( notation polonaise ) des arbres d'expression de : traverser l'arbre d'expression preorderly. Pour calculer la valeur d'une telle expression : balayer de droite à gauche, en plaçant les éléments dans une pile . Chaque fois que nous trouvons un opérateur, nous remplaçons les deux symboles supérieurs de la pile avec le résultat d'appliquer l'opérateur à ces éléments. Par exemple, le ∗ de d'expression + 234 , qui dans la notation d'infixe est (2 + 3) le ∗ 4) , seraient évalués comme ceci :

    Traversal fonctionnel

    Nous pourrions exécuter les mêmes traversals dans une langue fonctionnelle comme le Haskell using le code semblable à ceci : arbre de données a = zéro | Noeud (arbre a) (arbre a) preorder zéro = preorder (droite laissée par noeud de x) = ++ (preorder à gauche) ++ (preorder bien) zéro de priorité "après" = priorité "après" (droite laissée par noeud de x) = (priorité "après" laissée) ++ (droite de priorité "après") ++ zéro d'inorder = inorder (droite laissée par noeud de x) = (inorder laissé) ++ ++ (droite d'inorder)

    Traversée itérative

    Tous les algorithmes récursifs ci-dessus exigent l'espace de pile proportionnel à la profondeur de l'arbre. Le traversal récursif peut être converti en itératif suivre de diverses méthodes bien connues.

    Voir également

    Arbre de programmant
    Notation polonaise
    Profondeur-première recherche
    Recherche en largeur
  • .

    Random links:Banlieue noire de crique de brosse, Minnesota | Liste de gouverneurs coloniaux en 1701 | Ernest Dimnet | Disques passagers | Jeff Torborg | Traversal_del_árbol