Min bst må være i stand til å takle doble oppføringer. Har noen noen strategier for hvordan man skal gå om dette som ikke krever store mengder av koden? Jeg tenkte på konsekvent legge duplikater til høyre, men da vil rote opp bst rekkefølge. for eksempel hva som skjer når de dupliserte har to barn som igjen har to barn ?. sette inn duplikat er enkelt nok, men hva som skal gjøres med den noden det erstattet?
håndtere duplikater i en BST
Du kan gjøre nodene i binært søketre inn lenkede lister.
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>();
}
Her treeNode.itemser alltid en ikke-tom liste, slik at item1.compareTo(item2) == 0for hver item1og item2i treeNode.items.
For å sette inn et duplikat element, vil du finne det aktuelle TreeNodeobjektet og legge til et nytt element til items.
Logikken i å finne elementer er nesten det samme som du hadde før, bortsett fra at når du finner det aktuelle TreeNodeobjektet du har å gå lenket liste.
Så lenge det ikke er en selvbalanserende BST, ser jeg ikke noe problem med å sette like noder enten på venstre eller høyre for node som er lik dem.
Edit (etter SimonN bemerkning):
Hvis "duplisert node" i spørsmålet allerede har 2 barn, så bare sette den "nye duplikat node" til venstre og la venstre barn av den "gamle duplikat node" blir venstre barn av den "nye duplikat node".
La meg avklare med et eksempel. Treet før du setter inn en kopi:
4'
/ \
2 5
/ \
1 3
Og nå elementet 4''er satt inn:
4'
/ \
4'' 5
/
2
/ \
1 3
Så lenge treet er ikke selvbalanserende, bør du være i orden.
Jeg lurer på om du faktisk trenger å lagre de dupliserte oppføringer som separate noder? Vil legge til en tellervariabelen til Node være nok? På den måten hvis du traversere treet du vil vite hvor mange doble oppføringer og fortsatt bevare den rekkefølgen.













