trattare con i duplicati in un BST

voti
2

Il mio BST deve essere in grado di far fronte a voci duplicate. Qualcuno ha qualche strategie di come fare per questo che non necessita di una quantità eccessiva di codice? Ho pensato di aggiungere costantemente duplicati a destra, ma poi che la volontà rovinare l'ordine BST. per esempio ciò che accade quando il duplicato ha due figli che a loro volta hanno due figli ?. inserire il duplicato è abbastanza facile, ma ciò che deve essere fatto con il nodo che ha sostituito?

È pubblicato 10/10/2009 alle 08:51
fonte dall'utente
In altre lingue...                            


3 risposte

voti
2

Si potrebbe fare i nodi dell'albero binario di ricerca in liste collegate.

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>();    
}

Qui, treeNode.itemsè sempre una lista non vuota, in modo tale che item1.compareTo(item2) == 0per ogni item1e item2in treeNode.items.

Per inserire un elemento duplicato, si dovrebbe trovare il relativo TreeNodeoggetto e aggiungere un nuovo elemento a items.

La logica di trovare elementi è quasi lo stesso che si aveva prima, solo che una volta trovato il relativo TreeNodeoggetto che si deve camminare la lista collegata.

Risposto il 10/10/2009 a 13:17
fonte dall'utente

voti
3

Finché non è un auto bilanciamento BST, non vedo un problema con la messa nodi uguali sia a sinistra oa destra del nodo che è uguale a loro.

Edit (dopo l'osservazione di simonn):

Se il "nodo duplicato" in questione ha già 2 figli, quindi è sufficiente inserire la "nuova nodo duplicato" a sinistra e lasciare che il figlio sinistro del "vecchio nodo duplicato" diventare il figlio sinistro del "nuovo nodo duplicato".

Vorrei chiarire con un esempio. L'albero prima di inserire un duplicato:

    4'
   / \
  2   5
 / \
1   3

E ora l'elemento 4''è inserito:

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

Fino a quando l'albero non è di per sé il bilanciamento, si dovrebbe essere a posto.

Risposto il 10/10/2009 a 13:37
fonte dall'utente

voti
0

Mi chiedo se effettivamente bisogno di memorizzare le voci duplicate come nodi separati? Sarebbe l'aggiunta di una variabile contatore al Nodo essere abbastanza? In questo modo se si attraversa l'albero si dovrebbe conoscere il numero di voci duplicate ed ancora preservare l'ordine.

Risposto il 21/06/2012 a 19:26
fonte dall'utente

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