Mijn bst moet in staat zijn om te gaan met dubbele vermeldingen. Heeft iemand enig strategieën voor hoe om te gaan over dit dat grote hoeveelheden van de code niet vereist? Ik dacht aan consequent toe te voegen duplicaten naar rechts, maar dan zal dat verknoeien de bst bestelling. bijvoorbeeld wat er gebeurt als het duplicaat heeft twee kinderen die op hun beurt hebben twee kinderen ?. het inbrengen van het duplicaat is makkelijk genoeg, maar wat er gedaan moet worden met de knoop te vervangen?
behandeling van duplicaten in een bst
Je kon de knooppunten van de binaire zoekboom te maken in gelinkte lijsten.
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>();
}
Hier, treeNode.itemsis altijd een niet-lege lijst, zodat item1.compareTo(item2) == 0voor elke item1en item2in treeNode.items.
Om een duplicaat element in te voegen, zou je het relevant vindt TreeNodeobject en voeg een nieuw item aan items.
De logica van het vinden van elementen is bijna hetzelfde als u eerder had, behalve dat als je eenmaal het relevant vindt TreeNodeobject moet je de gekoppelde lijst te lopen.
Zolang het niet een zelfbalancerend BST, heb ik geen probleem met het assembleren van gelijke knooppunten, hetzij op de linker- of rechterkant van het knooppunt dat gelijk is aan hen is te zien.
Bewerken (na opmerking Simonn's):
Als de "dubbele knoop" in kwestie reeds heeft 2 kinderen, dan plaatst u de "nieuwe duplicate knooppunt" naar links en laat de linker kind van de "oude duplicate knooppunt" uitgegroeid tot de linker kind van de "nieuwe duplicate knooppunt".
Laat me verduidelijken met een voorbeeld. De boom voordat u een duplicaat:
4'
/ \
2 5
/ \
1 3
En nu is het element 4''wordt ingevoegd:
4'
/ \
4'' 5
/
2
/ \
1 3
Zolang de boom is niet uit zichzelf in evenwicht brengen, moet je wel goed.
Ik vraag me af als je echt nodig hebt om de dubbele items op te slaan als afzonderlijke knooppunten? Zou het toevoegen van een tellervariabele om uw Node genoeg? Op die manier als je de boom doorkruisen zou je het aantal dubbele vermeldingen kennen en nog steeds de orde te handhaven.













