lidiando con duplicados en un bst

votos
2

Mi BST tiene que ser capaz de hacer frente a las entradas duplicadas. ¿Alguien tiene alguna estrategia sobre cómo hacer esto que no requiera cantidades excesivas de código? Pensé en agregar consistentemente duplicados a la derecha, pero eso arruinaría la primera orden. por ejemplo, ¿qué sucede cuando el duplicado tiene dos hijos que a su vez tienen dos hijos? insertar el duplicado es bastante fácil, pero ¿qué se debe hacer con el nodo que reemplazó?

Publicado el 10/10/2009 a las 08:51
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
2

Puede convertir los nodos del árbol de búsqueda binario en listas vinculadas.

class Data implements Comparable<Data>
{
   // These are the data elements in your binary search tree
}

class TreeNode
{
  TreeNode left; // elements less than current node, or null
  TreeNode right; // elements greater than current node, or null
  List<Data> items = new LinkedList<Data>();    
}

En este caso, treeNode.itemses siempre una lista no vacía, de manera que item1.compareTo(item2) == 0para cada item1y item2en treeNode.items.

Para insertar un elemento duplicado, encontrará el TreeNodeobjeto relevante y agregará un nuevo elemento a items.

La lógica de encontrar elementos es casi la misma que tenías antes, excepto que una vez que encuentras el TreeNodeobjeto relevante , tienes que recorrer la lista enlazada.

Respondida el 10/10/2009 a las 13:17
fuente por usuario

votos
3

Siempre que no se trate de una BST auto compensada, no veo ningún problema para colocar nodos iguales a la izquierda o a la derecha del nodo que sea igual a ellos.

Editar (después de la observación de Simonn):

Si el "nodo duplicado" en cuestión ya tiene 2 hijos, simplemente inserte el "nuevo nodo duplicado" a la izquierda y deje que el hijo izquierdo del "antiguo nodo duplicado" se convierta en el hijo izquierdo del "nuevo nodo duplicado".

Déjame aclarar con un ejemplo. El árbol antes de insertar un duplicado:

    4'
   / \
  2   5
 / \
1   3

Y ahora el elemento 4''está insertado:

      4'
     / \
    4'' 5
   /
  2   
 / \
1   3

Mientras el árbol no se auto equilibre, deberías estar bien.

Respondida el 10/10/2009 a las 13:37
fuente por usuario

votos
0

Me pregunto si realmente necesita para almacenar las entradas duplicadas como nodos separados? Sería añadir una variable de contador a su Nodo será suficiente? De esta forma si se recorre el árbol que se sabe el número de entradas duplicadas y todavía preservar el orden.

Respondida el 21/06/2012 a las 19:26
fuente por usuario

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