håndtere duplikater i en BST

stemmer
2

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?

Publisert på 10/10/2009 klokken 07:51
kilden bruker
På andre språk...                            


3 svar

stemmer
2

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.

Svarte 10/10/2009 kl. 12:17
kilden bruker

stemmer
3

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.

Svarte 10/10/2009 kl. 12:37
kilden bruker

stemmer
0

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.

Svarte 21/06/2012 kl. 18:26
kilden bruker

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