procedimiento de eliminación para un árbol binario de búsqueda

votos
7

Considere el procedimiento de eliminación en un BST, cuando el nodo a borrar tiene dos hijos. Digamos que siempre sustituirlo por el nodo que tiene la clave mínimo en su subárbol derecho.

La pregunta es: ¿es este procedimiento conmutativa? Es decir, la supresión de x y luego y tiene el mismo resultado que la primera y la supresión y luego x?

Creo que la respuesta es no, pero no puedo encontrar un contraejemplo, ni averiguar cualquier razonamiento válido.

EDITAR:

Tal vez tengo que ser más claro.

Considere el transplant(node x, node y)procedimiento: se reemplace x con y (y su sub-árbol). Así, si quiero eliminar un nodo (por ejemplo x) que tiene dos hijos i sustituirlo por el nodo que tiene la clave mínimo en su subárbol derecho:

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 cuestión era cómo demostrar el procedimiento anterior no es conmutativa.

Publicado el 07/06/2010 a las 15:46
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
17

Eliminación (en general) no es conmutativa. Aquí es un contraejemplo:

    4
   / \
  3   7
     /
    6

¿Qué pasa si borramos 4 y 3?

Cuando borramos 4, obtenemos 6 como la nueva raíz:

   6
  / \
 3   7

Eliminación 3 no cambia el árbol, pero esto nos da:

  6
   \
    7

¿Qué pasa si borramos 3 y 4?

Cuando borramos el árbol 3 no cambia:

 4
  \
   7
  /
 6

Sin embargo, cuando ahora Borrar 4, la nueva raíz se convierte en 7:

  7
 /
6

Los dos árboles resultantes no son los mismos, por lo tanto, su eliminación no es conmutativa.

ACTUALIZAR

No he leído la restricción de que esto es cuando siempre se elimina un nodo con 2 niños. Mi solución es para el caso general. Voy a actualizar si / cuando puedo encontrar un contraejemplo.

Otra actualización

No tengo pruebas concretas, pero voy a aventurar una respuesta:

En el caso general, a manejar las supresiones de manera diferente en función de si usted tiene dos hijos, un niño, o no tiene hijos. En el contraejemplo I, siempre, en primer lugar eliminar un nodo con dos niños y luego un nodo con un niño. Después de eso, puedo borrar un nodo sin hijos y luego otro nodo con un niño.

En el caso especial de solamente borrar nodos con dos hijos, usted desea considerar el caso en que ambos nodos están en la misma sub-árbol (ya que no importa si están en diferentes sub-árboles, se puede estar seguro de que la estructura general no va a cambiar en base a la orden de supresión). Lo que realmente necesita para probar es si el orden de eliminación de nodos en la misma sub-árbol, donde cada nodo tiene dos hijos, asuntos.

Considere dos nodos A y B, donde A es un antepasado de B. A continuación, puede refinar aún más la cuestión es:

Es la eliminación conmutativa cuando usted está considerando la eliminación de dos nodos de un árbol binario de búsqueda que tienen una relación ancestro-descendiente entre sí (esto implicaría que están en la misma sub-árbol)?

Cuando se elimina un nodo (digamos A), que atraviesan la sub-árbol de la derecha para encontrar el elemento mínimo. Este nodo será un nodo hoja y nunca puede ser igual a B (porque B tiene dos hijos y no puede ser un nodo hoja). A continuación, reemplazar el valor de A con el valor de este nodo hoja. Lo que esto significa es que el único cambio estructural para el árbol es el reemplazo del valor de A con el valor de la hoja-nodo, y la pérdida de la hoja-nodo.

El mismo proceso está implicado por B. Es decir, se sustituye el valor del nodo y reemplazar un nodo hoja. Así que, en general, cuando se elimina un nodo con dos hijos, el único cambio estructural es el cambio en el valor del nodo que va a eliminar, y la supresión del nodo hoja, que es el valor que está utilizando como reemplazo .

Así que la pregunta es más refinada:

Pueden garantizar que siempre obtendrá el mismo nodo de sustitución sin tener en cuenta el orden de eliminación (cuando siempre se está eliminando un nodo con dos hijos)?

La respuesta (creo) es sí. ¿Por qué? Aquí hay algunas observaciones:

  • Digamos que se elimina el nodo descendiente primero y el segundo nodo antecesor. El sub-árbol que se modificó cuando se ha eliminado el nodo descendiente es no en el sub-árbol izquierdo del hijo derecho del nodo antecesor. Esto significa que este sub-árbol no se ve afectado. Lo que esto significa también es, independientemente del orden de deleción, dos diferentes se modifican sub-árboles y por lo tanto la operación es conmutativa.
  • Una vez más, digamos que se elimina el nodo descendiente primero y el segundo nodo antecesor. El sub-árbol que se modificó cuando se ha eliminado el nodo descendiente está en el sub-árbol izquierdo del hijo derecho del nodo antecesor. Pero incluso en este caso, no hay solapamiento. La razón es cuando se elimina el nodo descendiente en primer lugar, nos fijamos en el sub-árbol izquierdo del nodo descendiente derecho del niño. Cuando a continuación, eliminar el nodo antecesor, se le no ir por ese sub-árbol ya que tendrá siempre se va hacia la izquierda después de introducir izquierda sub-árbol del nodo antepasado de la derecha en el niño. Así que de nuevo, independientemente de lo que se elimina primero está modificando diferentes sub-árboles y por lo que parece el fin, no importa.
  • Otro caso es si se elimina el nodo ancestro primero y encuentra que el nodo mínimo es un hijo del nodo descendiente. Esto significa que el nodo descendiente va a terminar con un niño, y la supresión de la de un niño es trivial. Consideremos ahora el caso en que en este escenario, que ha eliminado el nodo descendiente en primer lugar. De allí tendría que sustituir el valor del nodo descendiente con su hijo derecho y luego eliminar el hijo derecho. A continuación, cuando se elimina el nodo antepasado, se termina encontrando el mismo nodo mínimo (hijo izquierdo del nodo eliminado de edad, que también es hijo izquierdo del nodo sustituido). De cualquier manera, se termina con la misma estructura.

Esto no es una prueba rigurosa; estas son sólo algunas observaciones que he hecho. Por todos los medios, no dude en hacer agujeros!

Respondida el 07/06/2010 a las 18:32
fuente por usuario

votos
0

Respondo aquí para segunda actualización de Vivin.

Creo que este es un buen refundición de la pregunta:

Es la eliminación conmutativa cuando usted está considerando la eliminación de dos nodos de un árbol binario de búsqueda que tienen una relación ancestro-descendiente entre sí (esto implicaría que están en la misma sub-árbol)?

pero esta frase en negrita a continuación no es cierto:

Cuando se elimina un nodo (digamos A), que atraviesan la sub-árbol de la derecha para encontrar el elemento mínimo. Este nodo será un nodo hoja y nunca puede ser igual a B

ya que el elemento mínimo en el subárbol derecho de una puede tener un hijo derecho . Por lo tanto, no es una hoja. Vamos a llamar el elemento mínimo en el subárbol derecho de una successor(A). Ahora bien, es cierto que B no puede ser successor(A), pero puede ser en su subárbol derecho. Por lo tanto, es un desastre.

Trato de resumir.

hipótesis :

  1. A y B tienen dos hijos cada una.
  2. A y B están en el mismo subárbol.

Otras cosas que podemos deducir de hipótesis:

  1. B no es successor(A), ni A es successor(B).

Ahora, teniendo en cuenta que, creo que hay 4 casos diferentes (como de costumbre, dejar ser un antepasado de B):

  1. B está en subárbol izquierdo de una
  2. B es un antepasado de successor(A)
  3. successor(A) es un antepasado de B
  4. B y sucesor (A) no tienen ninguna relación. (Están en diferentes sub-estructuras de A)

Creo (pero por supuesto no puedo probarlo) que los casos 1, 2 y 4 no tienen importancia. Así, sólo en el caso successor(A)es un antepasado del proceso de borrado B no podría ser conmutativa. O podría?

I pasar el balón:)

Saludos.

Respondida el 11/06/2010 a las 18:45
fuente por usuario

votos
2

Me parece que el contraejemplo muestra en la respuesta de Vivin es el único caso de no conmutatividad, y que de hecho es eliminado por la restricción de que sólo los nodos con dos niños se pueden eliminar.

Pero también puede ser eliminado si descartamos lo que parece ser una de las premisas de Vivin, que es que debemos recorrer el subárbol derecho tan poco como sea posible para encontrar un sucesor aceptable. Si, en cambio, siempre promovemos el nodo más pequeño en el subárbol derecho como el sucesor, independientemente de lo lejos que resulta estar situado, a continuación, incluso si relajamos la restricción sobre la supresión de nodos con menos de dos hijos, el resultado de Vivin

    7
   /
  6
Nunca se alcanza si comenzamos a

    4
   / \
  3 7
     /
    6

En su lugar, nos elimine primero 3 (sin sucesor) y elimine 4 (con 6 como sucesor), produciendo

    6
     \
      7

que es el mismo que si la orden de borrado se invirtieron.

Eliminación sería entonces conmutativa, y creo que siempre es conmutativa, dada la premisa de que he nombrado (sucesor es siempre menor nodo en el subárbol derecho del nodo eliminado).

Yo no tengo una prueba formal para ofrecer, más que una enumeración de los casos:

  1. Si los dos nodos a eliminar están en diferentes subárboles, a continuación, la deleción de uno no afecta a la otra. Sólo cuando están en el mismo camino puede el orden de eliminación posiblemente afecta el resultado.

    Por lo que cualquier efecto sobre la propiedad conmutativa puede venir solamente cuando un nodo antecesor y uno de sus descendientes se eliminan tanto. Ahora, ¿cómo afecta su relación vertical conmutatividad?

  2. Descendiente en el subárbol izquierdo del ancestro. Esta situación no afectará conmutatividad debido a que el sucesor viene del subárbol derecho y no puede afectar el subárbol izquierdo en absoluto.

  3. Descendiente en el subárbol derecho del ancestro. Si el sucesor del ancestro siempre es el nodo más pequeño en el subárbol derecho, entonces el orden de eliminación no se puede cambiar la elección del sucesor, no importa qué descendiente se elimina antes o después de que el ancestro. Incluso si el sucesor del ancestro resulta ser el nodo descendiente que también debe ser eliminado, que descendiente también se sustituye por el el más grande al lado de nodo a ella, y que descendiente no pueden tener su propio subárbol izquierdo restante a tratar . Por lo tanto la eliminación de un antepasado y cualquier descendiente derecho del subárbol será siempre conmutativa.

Respondida el 06/04/2011 a las 19:34
fuente por usuario

votos
0

Creo que hay dos formas igualmente viables para eliminar un nodo, cuando tiene 2 hijos:
PASE A CASO 4 ...

Caso 1: eliminar 3 (nodo hoja)
 2 3
 / \ -> / \
1 3 1


Caso 2: Eliminar 2 (nodo hijo izquierdo)
 2 3
 / \ -> / \
1 3 1


Caso 3: eliminar 2 (nodo hijo derecho)
 2 2
 / \ -> / \
1 3 3

______________________________________________________________________
Caso 4: Eliminar 2 (izquierda y derecha) nodos secundarios
 2 2 3
 / \ -> / \ o / \      
1 3 1 3
ambos trabajan y tienen diferentes árboles resultantes :) ______________________________________________________________________
Como algoritmo explicado aquí: http: // www .mathcs.emory.edu / ~ Cheung / Cursos / 323 / Programa / Árboles / 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

Respondida el 09/10/2016 a las 22:02
fuente por usuario

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