arbre rouge-noir principe de l'algorithme

Original: analyse approfondie arbre noir et implémentation Java , nous avons fait quelques erreurs dans l'original, pour voir si l'implémentation Java de l' arbre rouge-noir peut aller voir le texte original.
arbre rouge-noir est une sorte d'arbre binaire équilibré . Pour comprendre les arbres noirs, nous devons commencer par l'arbre de recherche binaire.

BST

arbre de recherche binaire (Binary arbre de recherche, appelée BST) est un arbre binaire, la valeur de son enfant à gauche est inférieure à la valeur du nœud parent est supérieure à la valeur du nœud parent et noeud droit. Sa hauteur détermine son efficacité de recherche. Dans le cas idéal, les suppressions de recherche d'arbre de recherche binaire complexité changé avec le temps de O (logN) (où N est le nombre de nœuds), le pire des cas est O (N). Quand il est à la hauteur de logN + 1, on dit qu'un arbre de recherche binaire est équilibrée.
bst

L'opération de BST

T  key = a search key
Node root = point to the root of a BST

while(true){
    if(root==null){
        break;
    }
    if(root.value.equals(key)){
        return root;
    }else if(key.compareTo(root.value)<0){
        root = root.left;
    }else{
        root = root.right;
    }
}
return null;
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • sept
  • 8
  • 9
  • dix
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

Comme on peut le voir à partir du programme, lorsque le BST de trouver, par rapport au premier courant noeud:

  • Si elles sont égales, alors le noeud courant est renvoyé;
  • Si moins que le nœud actuel continuera à regarder à gauche du noeud courant;
  • Si plus que le noeud courant est alors recherché le droit du noeud courant.

Tant que le nœud actuel est vide ou pointeur trouve le noeud correspondant, le programme pour effectuer les recherches.

opération BST insertion,

Node node = create a new node with specify value
Node root = point the root node of a BST
Node parent = null;

//find the parent node to append the new node
while(true){
   if(root==null)break;
   parent = root;
   if(node.value.compareTo(root.value)<=0){
      root = root.left;  
   }else{
      root = root.right;
   } 
}
if(parent!=null){
   if(node.value.compareTo(parent.value)<=0){//append to left
      parent.left = node;
   }else{//append to right
      parent.right = node;
   }
}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • sept
  • 8
  • 9
  • dix
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

L'insertion de trouver d'abord le noeud à insérer dans le nœud parent de la circulation, le nœud parent et la recherche logique, tout comme le rapport de la taille de la petite gauche, à droite grande. Après avoir trouvé le parent, par rapport au nœud parent, petit est inséré dans le noeud parent du noeud gauche est inséré dans le grand nœud parent à droite.

BST suppression

Dans un arbre de recherche binaire supprimer un noeud donné p de trois façons:

  1. enfant à gauche et à droite nœuds pas p, puis supprimez le nœud, modifiez le pointeur de nœud parent correspondant.
  2. Seul le noeud enfant gauche p (enfant à droite), parent et p, p gauche a placé l'enfant (droit de l'enfant) est connecté, puis supprimez p.
  3. À propos des enfants existent, trouver le prédécesseur immédiat de p dans l'ordre , il est l'enfant gauche du nœud racine sous-arbre p dans les nœuds les plus à droite, connecté aux s et droit de l' enfant de p de l'enfant droit, le parent de p noeud enfant gauche et p est connecté, puis supprimez p.
//从二叉查找树中删除指针p所指向的结点 
if(p.right == null) //p的右子树为空   
{  
    p = p.left;
}  
else if(p.left == null) //p的左子树为空   
{  
    p = p.right;
}  
else //左右子树均不空   
{  
    BSTNode s = p.left; //左孩子  
    while(s.right != null) //寻找结点p的中序前驱结点,                      
    {                   //也就是以s为根结点的子树中最右的结点   
        s = s.right;      
    }  
    s.right = p.right; //p的右孩子和s的右孩子相连   
    p = p.left; //p的左孩子和p的父节点相连 
}  
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • sept
  • 8
  • 9
  • dix
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

RBTree

Cependant BST question est: lorsque le nombre de résultats d'insertion dans un ordre d'insertion arbre incliné, différent conduira la hauteur de l'arbre est pas la même chose, mais un impact direct sur l'efficacité de l'arbre pour trouver la hauteur de l'arbre. LogN hauteur idéale est, dans le pire des cas, tous les nœuds sur une barre oblique, de sorte que la hauteur de l'arbre est N.

BST problèmes existants basés sur un nouvel arbre - arbre binaire équilibré (BST équilibré) produit. insertion d' un arbre équilibré et le temps de suppression, restera à la hauteur logN en tournant l'opération. Deux arbres où AVL sont représentatifs arbre équilibré et arbre rouge-noir. la poursuite de l' arbre AVL de l' équilibre global , entraînant des insertions mauvaises performances et les suppressions, comme la poursuite de l' application pratique dans l'équilibre local de l' arbre rouge-noir (rouge-noir Arbre, appelé RBTree), tels que le noyau Linux est complètement planificateur juste, timers haute résolution systèmes de fichiers ext3, les bibliothèques de différentes langues telles que Java et TreeMap TreeSet, la carte de C de la STL, multimap, multiset, etc., Java HashMap 8 RBTree également utilisés pour remplacer longue liste.

définition RBTree

RBTree défini comme suit:

  1. Un noeud possède des couleurs, noir ou rouge;
  2. Le nœud racine est noire;
  3. Deux nœuds rouges successifs ne peuvent se produire entre les nœuds parents et enfants;
  4. Un nœud de déplacement vers le bas à un noeud de feuille dans ses descendants, le numéro du noeud à travers lequel le noir doit être égale;
  5. noeud vide est considéré comme noir.

Structure de données représentée comme suit:

class  Node<T>{
   public   T value;
   public   Node<T> parent;
   public   boolean isRed;
   public   Node<T> left;
   public   Node<T> right;
}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • sept

RBTree BST en théorie ou un arbre, mais il maintiendra l'équilibre de l'arbre dans les opérations d'insertion et de suppression sur BST, qui garantit une haute hauteur du RBTree arbre peut apparaître sous (cas extrême [, logN + 1 logN] atteindre 2 * logN, mais en fait difficile de rencontre). Une telle complexité RBTree trouvent toujours le temps en O (logN) si près de la BST idéale. Supprimer et insérer des opérations complexes de temps RBTree est également O (logN).
L'opération de RBTree est de trouver l'opération de BST.

Insertion RBTree opération

insertion RBTree de BST et insérer le mode est le même , juste après l'insertion, pourrait conduire à un déséquilibre de l'arbre, alors vous avez besoin de faire tourner l'opération de restauration arbre et la couleur (appelé ici la réparation d'insertion ), de sorte qu'il soit compatible avec la définition de RBTree.

Le nouveau nœud est inséré dans le rouge , insérer la fin de l'opération de réparation si elles sont de couleur de nœud parent est noir alors l'opération de réparation. En d' autres termes, que lorsque le nœud rouge parent est la nécessité d'insérer une opération de réparation.

Insérez les opérations de réparation sont répartis dans les trois conditions suivantes :

Insertion d'une opération -Cas

cas 1: l'oncle de noeud nouvellement inséré nœuds rouges.

A ce moment, l'opération est la couleur du nœud parent et les nœuds et son oncle grand - parent interchangés , de sorte que répondent à la définition de RBTRee. Ci - dessous, l'opération après l'achèvement du noeud A devient le nouveau nœud. Si le nœud parent Un nœud est pas noir, puis continuer à faire l'opération de réparation .
insertion affaire1

Insertion -Cas 2

cas 2: insérer un nouveau noeud est vide oncle de noeud, le noeud grand-parent et le noeud parent et le nouveau noeud est sur une ligne diagonale.

A ce moment, le fonctionnement est le noeud d'opération à droite B, le nœud A et le parent et la couleur interchangeable . L'opération de réparation RBTRee par la hauteur et la couleur sont conformes à la définition de l' arbre rouge-noir. Si B et C sont le nœud droit du nœud, tant que l'opération devient laissée sur elle.
Insérer affaire2

Insertion -Cas 3

cas 3: noeud oncle est vide, et un noeud parent, le noeud parent et le nouveau noeud est pas sur la barre oblique.

A ce moment, le fonctionnement est le noeud C à gauche, de sorte que la conversion pour le cas 3 de l'étui 2 , puis le traitement de l' opération pour le cas 2 de la ligne. Cas n ° 2 fait d'une opération droitière de l'opération d'échange de couleurs et pour atteindre l'objectif. Si l'arbre est une image miroir de la structure de la figure., Seulement besoin d' un correspondant droitier à gaucher, gaucher à droitier en.
Insérer affaire3

Insérer résumé des opérations

Après l'opération de réparation est insérée dans un retour à l'opération de nœud racine, une fois que les nœuds concernés sont conformes à la définition de l'arbre rouge-noir, les extrémités de l'opération de réparation. La raison en est due à l'opération de sauvegarde boîtier 1 sera le noeud parent, oncle, noeud parent, et un changement de couleur, peut entraîner des noeuds de grand-parent de déséquilibre (arbre rouge-noir définit 3). Ce besoin de temps pour être grand-parent ajuster comme point de départ, sauvegarder, jusqu'à ce que le nœud racine, selon la définition du nœud racine est toujours noir.

suppression RBTree

Supprimer d' abord besoin de faire est de supprimer BST l' opération , après la suppression nécessaire de faire pour réparer suppression opération, l'arbre répond à la définition de l' arbre rouge-noir, répondent à la définition de la hauteur des arbres rouge-noir est équilibré.

Supprimer pour supprimer l'opération de réparation est destiné uniquement noeud noir de l' article IV, lorsque le noeud noir a été enlevé que l'arbre entier ne répond pas à la définition de RBTree. Traitement besoin de faire est nœud frère noir détaché de plus , s'il n'y a pas de nœud frère peut être détaché en noir, alors il ne peut remonter jusqu'à, soustraire un noeuds noirs à chaque niveau, ce qui rend toute la ligne d'arbre avec du rouge définir arbre noir.
Lorsque vous supprimez une opération de réparation face du noeud retiré est noeud rouge ou noeud racine arrive, l'opération de réparation est terminée.

opérations de suppression de réparation sont divisés en quatre cas:

Supprimer -case 1

cas 1: noeud frère à supprimer des noeuds est rouge.

Parce que frères et soeurs est temps noeud rouge ne peut pas être détaché des noeuds noirs, il est donc nécessaire d'augmenter le noeud frère du nœud parent , parce que le frère est rouge, par RBTree définition, le frère d' un nœud enfant est noir , vous pouvez d'elle nœud enfant détaché.

Après le cas ainsi converti 1 devient plus tard deux cas, le cas 3, ou 4 dans le cas d'une espèce. Besoin de faire une opération pour frères et soeurs à gauche ou à droite opération, puis la couleur de changement de nœud parent, a quitté le frère de l'enfant tourné que l'enfant droit de son nœud parent d' origine .
Supprimer affaire1

-Cas 2 deletion

cas 2: noeud frère à nœud supprimé est noir, et les frères et sœurs de nœuds enfants sont noirs.

Parce que les enfants et frères et soeurs nœuds de nœuds sont noirs, il peut être nœuds frères rouges , mais parce que les nœuds frères nœud parent peut être noir et rouge, le temps nécessaire au noeud A devient le nouveau nœud parent, continuer vers le haut ajustée jusqu'à ce que la couleur de l'arbre entier se réunit avec des morceaux de RBTree définis.
supprimer 2

Supprimer -case 3

cas 3: noeud frère à être supprimé nœud est le nœud noir, et de mêmes parents noeud enfant gauche est enfant rouge, à droite est noir (ce qui est le cas de la fratrie à droite), si les frères et sœurs vers la gauche, puis, frères et soeurs est l'enfant le droit est rouge, l'enfant gauche est noir. Je comprends et se rapprocher de supprimer un nœud est rouge.

A ce moment, l'opération est effectuée dans le noeud de tourbillonnement rouge ascendant, puis le convertir en sa couleur d'origine du noeud parent, converti en cas 4.
supprimer 3

Supprimer -case 4

cas 4: noeud frères et soeurs à nœud supprimé est noir, et l'enfant droit du frère est (le cas des frères et sœurs à droite) rouge, si le nœud frère gauche est l'enfant gauche est rouge. Il est assez loin que le rouge.

Un dessous du nœud doit être supprimé, l'opération à ce moment est un nœud de frères et soeurs D augmente font la rotation, la conversion des couleurs, et D B est le nœud parent, l'enfant gauche C D B devient l'enfant droit, droit de l'enfant D devient rouge noir.
supprimer 4

Résumé de l'opération de suppression

Supprimer arbre rouge-noir est la plus opération complexe, lieu compliqué est que lorsque supprimé noeud noir quand et comment aller détaché du nœud frère noir, afin de garantir que la couleur de l'arbre correspond à la définition. En raison du détachement de frères et soeurs rouge n'est pas un des noeuds noirs, cela ne peut fonctionner grâce à la rotation de sorte qu'il est passé au nœud parent, et parce qu'il est un nœud rouge, ses nœuds enfants est noir, peut être détaché.

Pour le nœud frère est un nœud noir peut être divisé en trois cas traités, Cas 1 est: nœud frère lorsque le nœud enfant sont noirs, rouges peuvent être des nœuds frères et soeurs directement, telle couleur partielle arbre rouge-noir est conforme à définition. Mais les morceaux entiers de l'arbre est pas nécessairement conforme à la définition de l'arbre rouge-noir, nous devons continuer à ajuster rétroactivement à la hausse.

Cas n ° 2 est: les nœuds enfants frères et soeurs du rouge foncé à gauche et à droite. Cas n ° 3 est: un noeud enfant droit est un frère de rouge (nœud enfant laissé au hasard). Nous pouvons commencer par tourner le second cas, devient le troisième cas, cette fois pour le nœud frère droit noir, nœuds frères rouges, les noeuds peuvent être détachés sur faire deux noeuds noirs, de manière à assurer supprimé noeud noir , l'arbre entier ou répondent à la définition d'un arbre rouge-noir, car le nombre de noeuds noirs n'a pas changé.

Publié 24 articles originaux · louange gagné 1 · vues 533

Original: analyse approfondie arbre noir et implémentation Java , nous avons fait quelques erreurs dans l'original, pour voir si l'implémentation Java de l' arbre rouge-noir peut aller voir le texte original.
arbre rouge-noir est une sorte d'arbre binaire équilibré . Pour comprendre les arbres noirs, nous devons commencer par l'arbre de recherche binaire.

Je suppose que tu aimes

Origine blog.csdn.net/qq_45366515/article/details/104133238
conseillé
Classement