web-dev-qa-db-fra.com

Comment se rappeler facilement les insertions et suppressions d'arbres rouges et noirs?

Il est assez facile de comprendre parfaitement l’arbre de recherche binaire standard et ses opérations. En raison de cette compréhension, je n'ai même pas besoin de me rappeler les implémentations de ces opérations d'insertion, de suppression et de recherche.

J'apprends maintenant l'arbre rouge-noir et je comprends ses propriétés pour maintenir l'équilibre de l'arbre. Cependant, j’ai beaucoup de mal à comprendre ses procédures d’insertion et de suppression.

Je comprends que lors de l’insertion d’un nouveau nœud, nous le marquons en rouge (car le rouge est ce que nous pouvons faire de mieux pour ne pas enfreindre les lois de l’arbre rouge-noir). Le nouveau nœud rouge peut toujours enfreindre la loi "pas de nœuds rouges continus". Ensuite, nous le réparons via:

  1. vérifiez la couleur de son oncle, si elle est rouge, puis marquez son parent et son oncle en tant que noirs et passez chez les grands-parents.

  2. si c'est l'enfant de droite, tourne à gauche son parent

  3. marque son parent en noir et son grand-parent en rouge, puis tourne à droite son grand-parent.

fait (fondamentalement comme ci-dessus).

De nombreux endroits décrivent l'insertion de l'arbre rouge-noir comme ci-dessus. Ils vous disent simplement comment le faire. Mais pourquoi ces étapes peuvent réparer l’arbre? Pourquoi d'abord tourner à gauche, puis à droite?

Quelqu'un peut-il m'expliquer pourquoi plus clairement, encore plus que le CLRS? Quelle est la magie de la rotation?

Je souhaite vraiment comprendre afin qu'après un an, je puisse mettre en œuvre Red-Black tree par moi-même sans passer en revue un livre.

Merci

29
Jackson Tale

ignorer mon commentaire (maintenant supprimé) - je pense que le code d'okasaki va vous aider. Si vous avez le livre ("structures de données purement fonctionnelles"), regardez le texte de la page 26 et la figure 3.5 (ci-contre, p. 27). il est difficile d'être plus clair que cela.

malheureusement la thèse disponible en ligne n’a pas cette partie.

je ne vais pas le copier parce que le diagramme est important, mais il montre que tous les cas différents sont fondamentalement les mêmes et donne un code ML très simple qui martèle tout cela.

[mise à jour] il semblerait que vous puissiez le voir sur Amazon. allez sur la page du livre , passez la souris sur l'image et entrez "rouge noir" dans la case de recherche. cela vous donne des résultats incluant les pages 25 et 26, mais vous devez être connecté pour les voir (apparemment, je n'ai pas essayé de me connecter pour vérifier).

2
andrew cooke

Pour le bénéfice de tous ceux qui liront ce fil et qui n'ont pas accès au livre mentionné dans la réponse acceptée, voici ce que j'espère être une réponse descriptive acceptable.

La rotation met l'arbre dans un état où il remplit les critères de recoloration (le noeud enfant a un oncle rouge). Il y a deux différences principales:

  • quel nœud est le "enfant" et quel nœud est le "oncle" a changé;
  • au lieu de recolorer le parent et l'oncle en noir et les grands-parents en rouge, vous recolorez le parent en rouge et les grands-parents en noir. 

Lorsque le nœud enfant n'a pas d'oncle rouge, vous devez effectuer une rotation, car si le nœud oncle est déjà noir, la création du parent noir augmenterait la hauteur du noir de 1 sur un seul côté du grand-parent. Cela violerait la propriété invariante de la hauteur des arbres rouge-noir et rendrait l'arbre déséquilibré. 

Voyons maintenant comment la rotation transforme l'arborescence de manière à avoir un noeud enfant avec un oncle rouge et à pouvoir utiliser la recoloration. Je recommande de dessiner ceci pour bien le comprendre.

  • Soit x le noeud rouge actuel avec un parent rouge.
  • Soit p le parent rouge de x avant la rotation (si le parent était noir, nous aurions déjà fini).
  • Soit y l'oncle noir de x avant la rotation (si l'oncle était rouge, nous n'aurions pas besoin de rotation. Nous recolorierions simplement le parent et l'oncle en noir et les grands-parents en rouge).
  • Soit g le grand-parent noir de x avant la rotation (puisque le parent est rouge, le grand-parent doit être noir; sinon, ce n'était pas un arbre rouge-noir pour commencer.)
  • Lorsque vous avez un cas gauche-gauche (LL) ou droit-droit (RR) (c'est-à-dire, x est l'enfant gauche de p et p est l'enfant gauche de g OR x est l'enfant droit de p et p est l'enfant droit de g), après une rotation unique (droite si LL, gauche si RR), y devient l'enfant et x son oncle. Puisque x est un oncle rouge, vous avez maintenant un cas dans lequel vous pouvez recolorer. Donc, recolorez le parent de l'enfant (puisque l'enfant est maintenant y, son parent est g) en rouge, et le grand-parent de l'enfant (qui est maintenant p) en noir. 
  • Lorsque vous avez un LR (x est l'enfant gauche ou p et p et que l'enfant est droit de g) ou RL cas (x est l'enfant droit de p et p est l'enfant gauche de g), après une double rotation (droite puis gauche si LR, gauche puis droite si RL), y devient l'enfant et p son oncle. Puisque p est un oncle rouge, vous avez à nouveau un cas dans lequel vous pouvez recolorer. Donc, recolorez le parent (puisque l'enfant est maintenant y, son parent est g) en rouge, et le grand-parent de l'enfant (qui est maintenant x) en noir.

Avant la rotation et la recoloration, vous aviez un grand-parent noir avec 2 nœuds rouges et 0 nœuds noirs du côté A (gauche ou droit) et 0 nœuds rouges et 1 nœud noir du côté B (à l'opposé du côté A). Après la rotation et la recoloration, vous avez un grand-parent noir avec 1 nœud rouge et 0 nœud noir du côté A, 1 nœud rouge et 1 nœud noir du côté B. Vous avez donc essentiellement déplacé l’un des nœuds rouges vers l’autre sous-arbre de le grand-parent sans augmenter la hauteur noire de l'un ou l'autre des sous-arbres.

C'est la magie de la rotation. Il vous permet de déplacer le nœud rouge supplémentaire vers une autre branche sans modifier la hauteur du noir, tout en préservant la propriété de parcours triée d'un arbre de recherche binaire. 

16
Serge Binette

La logique est assez simple. Supposons que z soit rouge et que le parent de z soit rouge: Si l'oncle de z est rouge, effectuez l'étape 1 pour pousser le noeud problématique vers le haut jusqu'à ce que Soit (1) le parent devienne la racine. Ensuite, marquez simplement la racine noire. Fait Ou (2) l'oncle de z est noir.

Dans le cas (2) Soit (a) z est l’enfant de gauche de son parent, l’étape 3 sera la dernière étape, car toutes les propriétés de BST sont remplies. Fait. Ou (b) z est l'enfant légitime de son parent. L'étape 2 convertira le problème en cas (a). Ensuite, faites step3. Terminé.

La logique est donc d'essayer d'atteindre les cas (1) et (2a), selon la première éventualité. Ce sont les situations pour lesquelles nous connaissons les solutions.

5
blackgreenmac

Tout arbre 2-4 (2-3-4) peut être converti en un arbre rouge-noir. Et comprendre 2 à 4 arbres est beaucoup plus facile. Si vous ne faites que parcourir les opérations d'insertion et de suppression dans 2 à 4 arborescences, vous sentirez qu'il n'est pas nécessaire de se souvenir de règles pour obtenir la même chose. Vous verrez une logique simple et claire vous permettant de trouver les solutions pour gérer différents scénarios d’insertion et de suppression.

Une fois que vous avez une compréhension claire de 2 à 4 arbres, chaque fois que vous traitez avec des arbres rouge-noir, vous pouvez cartographier mentalement ces arbres rouge-noir en 2 à 4 arbres et inventer une logique par vous-même.

J'ai trouvé quelques vidéos qui sont extrêmement utiles pour comprendre 2-4 arbres, arbres rouge-noir et la cartographie de 2-4 arbres en arbres rouge-noir. Je recommanderais de regarder ces vidéos.

1) Pour 2-4 arbres: http://www.youtube.com/watch?v=JZhdUb5F7oY&list=PLBF3763AF2E1C572F&index=13

2) Pour les arbres rouge-noir: http://www.youtube.com/watch?v=JRsN4Oz36QU&list=PLBF3763AF2E1C572F&index=14

Même si ce sont des vidéos d’une heure chacune, j’ai pensé que cela valait la peine de les regarder.

0
Nagakishore Sidde

Cela vaut peut-être la peine de commencer par des arbres noirs et rouges à gauche . Ils offrent une implémentation simplifiée intéressante.

0
Peteris