procédure de suppression pour un arbre de recherche binaire

voix
7

Pensez à la procédure de suppression sur un BST, lorsque le nœud de supprimer a deux enfants. Disons que je remplacerai toujours avec le nœud en maintenant la touche minimum dans son sous-arbre droit.

La question est: cette procédure est commutative? Autrement dit, la suppression de x et y a le même résultat que la suppression de la première, puis y x?

Je pense que la réponse est non, mais je ne peux pas trouver un contre, ni comprendre un raisonnement valable.

MODIFIER:

Peut-être que je dois être plus clair.

Considérez la transplant(node x, node y)procédure: il remplacer x par y (et son sous - arbre). Donc, si je veux supprimer un noeud ( par exemple x) qui a deux enfants , je le remplace par le nœud en maintenant la touche minimum dans son sous - arbre droit:

y = minimum(x.right)
transplant(y, y.right) // extracts the minimum (it doesn't have left child)
y.right = x.right
y.left = x.left
transplant(x,y)

La question était de savoir comment prouver la procédure ci-dessus n'est pas commutative.

Créé 07/06/2010 à 15:46
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
17

La suppression (en général) n'est pas commutative. Voici un contre:

    4
   / \
  3   7
     /
    6

Et si nous supprimons 4 et 3?

Lorsque nous supprimons 4, nous obtenons 6 comme la nouvelle racine:

   6
  / \
 3   7

La suppression 3 ne change pas l'arbre, mais nous donne ceci:

  6
   \
    7

Et si nous supprimons 3 et 4?

Lorsque l'on supprime l'arbre 3 ne change pas:

 4
  \
   7
  /
 6

Cependant, lorsque nous supprimons maintenant 4, la nouvelle racine devient 7:

  7
 /
6

Les deux arbres résultants ne sont pas les mêmes, par conséquent la suppression n'est pas commutative.

METTRE À JOUR

Je ne l'ai pas lu la restriction que ce soit lorsque vous supprimez toujours un nœud avec 2 enfants. Ma solution est pour le cas général. Je mettrai à jour si / quand je peux trouver un contre-exemple.

une mise à jour

Je n'ai pas la preuve concrète, mais je vais hasarder une hypothèse:

Dans le cas général, vous gérez les suppressions différemment selon que vous avez deux enfants, un enfant ou pas d'enfant. Dans le contre-exemple, je fourni, je d'abord supprimer un nœud avec deux enfants, puis un nœud avec un enfant. Après cela, je supprime un noeud sans enfant, puis un autre nœud avec un enfant.

Dans le cas particulier de ne supprimer des nœuds avec deux enfants, vous voulez examiner le cas où les deux noeuds sont dans le même sous-arbre (car il ne serait pas grave si elles sont en sous-arbres différents, vous pouvez être sûr que le structure globale ne changera pas en fonction de l'ordre de suppression). Qu'est-ce que vous avez vraiment besoin de prouver est de savoir si l'ordre de suppression de nœuds dans le même sous-arbre, où chaque noeud a deux enfants, les questions.

Considérons deux nœuds A et B où A est un ancêtre de B. Ensuite, vous pouvez affiner davantage la question à:

Est-commutative de suppression lorsque vous envisagez la suppression de deux nœuds d'un arbre de recherche binaire qui ont une relation descendante ancêtre de l'autre (cela implique qu'ils sont dans le même sous-arbre)?

Lorsque vous supprimez un nœud (disons A), vous traversez le sous-arbre droit de trouver l'élément minimum. Ce nœud sera un nœud feuille et ne peut jamais être égale à B (parce que B a deux enfants et ne peut pas être un nœud feuille). Vous pouvez ensuite remplacer la valeur de A avec la valeur de cette feuille-nœud. Ce que cela signifie est que le seul changement structurel de l'arbre est le remplacement de la valeur de A avec la valeur de la feuille nœud, et la perte de la feuille nœud.

Le même processus est impliqué pour B. C'est, vous remplacez la valeur du nœud et de remplacer un nœud feuille. Donc , en général, lorsque vous supprimez un nœud avec deux enfants, le seul changement structurel est la variation de valeur du nœud que vous supprimez, et la suppression du nœud feuille qui est la valeur que vous utilisez en remplacement .

La question est plus raffinée:

Pouvez-vous garantir que vous obtiendrez toujours le même nœud de remplacement quel que soit l'ordre de suppression (lorsque vous supprimez toujours un nœud avec deux enfants)?

La réponse (je pense) est oui. Pourquoi? Voici quelques observations:

  • Disons que vous supprimez le nœud descendant premier et le noeud ancêtre seconde. Le sous-arbre qui a été modifié lorsque vous avez supprimé le nœud descendant est pas dans le sous-arbre gauche de l' enfant droit du nœud ancêtre. Cela signifie que ce sous-arbre reste inchangé. Ce que cela veut dire aussi quel que soit l'ordre de suppression, deux différents sont modifiés sous-arbres et donc l'opération est commutative.
  • Encore une fois, disons que vous supprimez le noeud descendant premier et le noeud ancêtre seconde. Le sous-arbre qui a été modifié lorsque vous avez supprimé le nœud descendant est dans le sous-arbre gauche de l' enfant droit du nœud ancêtre. Mais même ici, il n'y a pas de chevauchement. La raison en est lorsque vous supprimez le nœud descendant d' abord, vous regardez le sous-arbre gauche du noeud descendant droit enfant. Lorsque vous supprimez le nœud ancêtre, vous ne descendre que sous-arbre puisque vous serez toujours être allez vers la gauche après que vous entrez sous-arbre gauche du noeud ancêtre droit enfant. Donc , encore une fois, peu importe ce que vous supprimez d' abord vous modifiez les différents sous-arbres et il semble donc l' ordre n'a pas d' importance.
  • Un autre cas est si vous supprimez le nœud ancêtre premier et vous trouvez que le nœud minimum est un enfant du nœud descendant. Cela signifie que le nœud descendant se termine avec un enfant, et la suppression de l'un enfant est trivial. Considérons maintenant le cas où , dans ce scénario, vous avez supprimé le nœud descendant en premier. Ensuite , vous remplacez la valeur du nœud descendant avec son enfant à droite, puis supprimer l'enfant droit. Ensuite , lorsque vous supprimez le nœud ancêtre, vous finissez par trouver le même noeud minimum (enfant gauche de l'ancien noeud supprimé, qui est aussi l' enfant gauche du nœud remplacé). De toute façon, vous vous retrouvez avec la même structure.

Ce n'est pas une preuve rigoureuse; ce ne sont que quelques observations que j'ai fait. Par tous les moyens, ne hésitez pas à percer des trous!

Créé 07/06/2010 à 18:32
source utilisateur

voix
0

Je réponds ici à la deuxième mise à jour Vivin.

Je pense que cela est une bonne refonte de la question:

Est-commutative de suppression lorsque vous envisagez la suppression de deux nœuds d'un arbre de recherche binaire qui ont une relation descendante ancêtre de l'autre (cela implique qu'ils sont dans le même sous-arbre)?

mais cette phrase en gras ci-dessous n'est pas vrai:

Lorsque vous supprimez un nœud (disons A), vous traversez le sous-arbre droit de trouver l'élément minimum. Ce nœud sera un nœud feuille et ne peut jamais être égal à B

puisque l'élément minimum d'un sous - arbre droit peut avoir un enfant droit . Donc, ce n'est pas une feuille. Appelons l'élément minimum d'un sous - arbre droit successor(A). Maintenant, il est vrai que B ne peut pas être successor(A), mais il peut être dans son sous - arbre droit. Ainsi, il est un gâchis.

J'essaie de résumer.

hypothèse :

  1. A et B ont deux enfants chacun.
  2. A et B sont dans la même sous-arbre.

D' autres choses que nous pouvons en déduire l' hypothèse:

  1. B n'est pas successor(A), ni A est successor(B).

Maintenant, étant donné que, je pense qu'il ya 4 différents cas (comme d'habitude, laissez-être un ancêtre de B):

  1. B est en sous-arbre gauche de A
  2. B est un ancêtre de successor(A)
  3. successor(A) est un ancêtre de B
  4. B et successeur (A) n'ont aucune relation. (Ils sont dans des sous-arbres de A)

Je pense (mais bien sûr , je ne peux pas le prouver) que les cas 1, 2 et 4 ne sont pas d' importance. Ainsi, seulement dans le cas successor(A)est un ancêtre de la procédure de suppression B ne pouvait pas être commutative. Ou pourrait - il?

Je passe la balle:)

Cordialement.

Créé 11/06/2010 à 18:45
source utilisateur

voix
2

Il me semble que le contre-indiqué dans la réponse de Vivin est le seul cas de non-commutatif, et qu'il est en effet éliminé par la restriction que les nœuds seulement avec deux enfants peuvent être supprimés.

Mais il peut aussi être éliminé si nous écartons ce qui semble être l'un des locaux de Vivin, qui est que nous devons traverser le sous-arbre droit aussi peu que possible de trouver un successeur acceptable. Si, au contraire, nous favorisons toujours le plus petit nœud dans le sous-arbre droit comme successeur, quelle que soit la distance à laquelle il se révèle être situé, alors même si nous relâchons la restriction sur la suppression de noeuds avec moins de deux enfants, le résultat de Vivin

    7
   /
  6
est jamais atteint si nous commençons à

    4
   / \
  3 7
     /
    6

Au lieu de cela, il faudrait d'abord supprimer 3 (sans successeur), puis supprimer 4 (avec 6 comme successeur), ce qui donne

    6
     \
      7

qui est le même que si l'ordre de suppression ont été inversées.

La suppression serait alors commutative, et je pense qu'il est toujours commutative, compte tenu de la prémisse que j'ai nommé (successeur est toujours le plus petit noeud en sous-arbre droit du nœud supprimé).

Je n'ai pas de preuve formelle à offrir, simplement une énumération des cas:

  1. Si les deux nœuds à supprimer sont dans différents sous-arbres, la suppression de l'un ne touche pas l'autre. Seulement quand ils sont dans le même chemin peut l'ordre de suppression affecte éventuellement le résultat.

    Ainsi, aucun effet sur commutativité ne peut venir que quand un nœud ancêtre et l'un de ses descendants sont tous deux supprimés. Maintenant, comment leur relation verticale affecte commutatif?

  2. Descendant dans le sous - arbre gauche de l'ancêtre. Cette situation n'affectera pas commutatif parce que le successeur vient du sous - arbre droit et ne peut pas affecter la sous - arborescence à gauche du tout.

  3. Descendant dans le sous - arbre droit de l'ancêtre. Si le successeur est toujours le plus petit nœud dans le sous - arbre droit de l'ancêtre, alors l' ordre de suppression ne peut pas changer le choix du successeur, peu importe ce descendant est supprimé avant ou après l'ancêtre. Même si le successeur de l'ancêtre se révèle être le nœud descendant qui est également à supprimer, ce descendant trop est remplacé par le suivant plus grand noeud, et ce descendant ne peut pas avoir son propre sous - arbre gauche restant à traiter . Ainsi , la suppression d'un ancêtre et un descendant-sous - arbre droit sera toujours commutative.

Créé 06/04/2011 à 19:34
source utilisateur

voix
0

Je pense qu'il ya deux façons tout aussi viables pour supprimer un noeud, quand il a 2 enfants:
PASSER A CASE 4 ...

Cas 1: supprimer 3 (noeud feuille)
 2 3
 / \ -> / \
1 3 1


Cas n ° 2: supprimer 2 (noeud enfant gauche)
 2 3
 / \ -> / \
1 3 1


Cas n ° 3: supprimer 2 (noeud enfant droit)
 2 2
 / \ -> / \
1 3 3

______________________________________________________________________
Cas 4: supprimer 2 (gauche et droite nœuds enfants)
 2 2 3
 / \ -> / \ ou / \      
1 3 1 3
fois pour travailler et avoir des arbres résultant :) ______________________________________________________________________
Comme algorithme expliqué ici: http: // www .mathcs.emory.edu / ~ / Cours cheung / 323 / Syllabus / Arbres / AVL-delete.html Deleting a node with 2 children nodes: 1) Replace the (to-delete) node with its in-order predecessor or in-order successor 2) Then delete the in-order predecessor or in-order successor

Créé 10/10/2016 à 01:02
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more