Partage de technologie

Notes sur la structure des données : thread d'arbre binaire

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

L'arbre binaire est une structure de données importante composée de nœuds, chaque nœud ayant au plus deux nœuds enfants. Dans certains cas, nous devons parcourir un arbre binaire pour visiter tous ses nœuds. Cependant, dans les arbres binaires déséquilibrés, les méthodes de parcours ordinaires peuvent conduire à des inefficacités. Pour résoudre ce problème, nous pouvons utiliser une technique appelée « threading » pour optimiser le processus de parcours.

1. Qu'est-ce que le threading d'arbre binaire ?

Le threading d'arbre binaire fait référence au processus de conversion d'un arbre binaire en un arbre binaire threadé. L'arbre binaire d'indices ajoute deux pointeurs à l'arbre binaire d'origine : ltag et rtag, qui pointent respectivement vers le prédécesseur et le successeur de l'enfant de gauche et de l'enfant de droite. Cela permet un parcours facile dans la commande, en pré-commande et après-commande.

2. Comment implémenter le threading des arbres binaires ?

  1. Enfilage à mi-séquence

Le threading dans l’ordre est obtenu en modifiant l’algorithme de parcours dans l’ordre. Lorsqu'on accède à un nœud, nous connectons les informations d'indice entre le nœud et son nœud prédécesseur. Les étapes spécifiques sont les suivantes :

  • Initialisez un pointeur pre, utilisé pour enregistrer le nœud prédécesseur du nœud actuellement visité.
  • Parcourez chaque nœud de l'arbre binaire, pour chaque nœud :
    • S'il s'agit du premier nœud visité, son lchild est défini sur pre et ltag est défini sur 1.
    • Si son nœud prédécesseur a été déterminé (c'est-à-dire que pre n'est pas vide), son rchild est défini sur pre et rtag est défini sur 1.
    • Mettez à jour pre vers le nœud actuel.
  1. signalement de précommande

Les idées d'indice de précommande et d'indice de mi-commande sont similaires, mais vous devez faire attention au problème du cercle magique des gouttes d'amour. Lorsque ltag=0, le sous-arbre de gauche peut être indiqué en pré-ordre. Les étapes spécifiques sont les suivantes :

  • Initialisez un pointeur pre, utilisé pour enregistrer le nœud prédécesseur du nœud actuellement visité.
  • Parcourez chaque nœud de l'arbre binaire, pour chaque nœud :
    • S'il s'agit du premier nœud visité, son lchild est défini sur pre et ltag est défini sur 1.
    • Si son nœud prédécesseur a été déterminé (c'est-à-dire que pre n'est pas vide), son rchild est défini sur pre et rtag est défini sur 1.
    • Mettez à jour pre vers le nœud actuel.
    • Si ltag=0, le thread de précommande est effectué de manière récursive sur le sous-arbre de gauche.
  1. Indices post-commande

Le threading post-commande suit également une idée similaire, mais une attention particulière doit être portée lors du traitement du rchild et du rtag du dernier nœud. Les étapes spécifiques sont les suivantes :

  • Initialisez un pointeur pre, utilisé pour enregistrer le nœud prédécesseur du nœud actuellement visité.
  • Parcourez chaque nœud de l'arbre binaire, pour chaque nœud :
    • S'il s'agit du premier nœud visité, son lchild est défini sur pre et ltag est défini sur 1.
    • Si son nœud prédécesseur a été déterminé (c'est-à-dire que pre n'est pas vide), son rchild est défini sur pre et rtag est défini sur 1.
    • Mettez à jour pre vers le nœud actuel.
    • Lorsque le dernier nœud est rencontré, son rchild est défini sur pre et rtag est défini sur 1.

3. Points sujets aux erreurs

Lors du processus d'implémentation du threading d'arbre binaire, voici quelques points courants sujets aux erreurs :

  1. Le traitement spécial de rchild et rtag du dernier nœud est ignoré.
  2. Lors du processus de précommande, le problème du cercle magique des gouttes d'amour n'a pas été traité correctement.
  3. Le pré-pointeur n’est pas correctement initialisé ou mis à jour.

4. Résumé

Le threading d’arbre binaire est une méthode efficace pour optimiser les stratégies de traversée. En ajoutant des pointeurs supplémentaires et en modifiant l'algorithme de parcours, nous pouvons accéder plus efficacement à tous les nœuds de l'arbre binaire. Dans les applications pratiques, nous devons veiller à éviter certaines des erreurs courantes mentionnées ci-dessus afin de garantir l'exactitude et la stabilité du code.