Ho un BST che ha voci duplicate. Sto cercando di trovare voci duplicate. Ora ovviamente posso scrivere un algoritmo stupido che attraversa l'intero albero, che è facile.Strategia per trovare le voci duplicate in un albero di ricerca binario
Tuttavia, desidero scriverne uno più efficiente. Ecco cosa ho fatto/pensato finora:
Assumere l'albero seguente.
10
/ \
5 15
/\ /\
2 8 10 16
\ \
8 12
Se voglio trovare tutte 8 di, io per prima trovare il 8 sulla sottoalbero sinistro del 10. Per trovare un duplicato, se non ha figlio destro, sta andando essere più a sinistra nodo nella sottostruttura di destra del primo genitore che è più grande di quel nodo (8)? E se ha avuto un figlio giusto, allora può essere o nel nodo più a sinistra del suo sottoalbero destro o nel nodo più a destra nel suo sottoalbero sinistro?
Sono tutti questi casi, che possono essere raggiunti con una serie di loop e if-statement?
In caso negativo, qual è l'approccio migliore? Qualcuno può aiutare?
Grazie
EDIT: In realtà ho appena capito che non può essere il "più nodo di sinistra" o "nodo più a destra". Quello troverebbe il nodo che è il prossimo valore più alto o il valore più basso precedente. Prima sarebbe un nodo?
EDIT 2:
fisso il mio esempio BST. Segue il seguente metodo di inserimento:
if (node == null)
return new NodeBST<Value>(name, value);
if (node.key().compareTo(name) > 0)
node.setLeft(insert(node.left(), name, value));
else
node.setRight(insert(node.right(), name, value));
Ciò significa che i duplicati saranno aggiunti alla destra dei loro duplicati .. giusto?
Sai in anticipo che cosa numero che si sta cercando? – lynks
Questo non sconfigge lo scopo di un BST? – Jasoneer
Questo non è un BST corretto. Non è possibile avere 8 sul ramo destro della radice 10. –