views:

199

answers:

2

I want to make my avl tree support adding duplicates but there is a problem with the default behavior of the binary search tree with duplicates that the rotation could make nodes with equal key be on the left and the right of the parent

for example adding A,A,A will cause the tree to do a rotation to be something like that

   A
  /  \ 
 A    A

so getting all the entries with that key will be a problem...and searching in both direction is not something good

the solution that i have thought of is making each node stores an array of duplicates so when adding a new item that already exists will be just adding a new item to the array , removing item with key will delete the whole node while the find all items with key will return that array.

are there are any other methods to handle duplicates ?

the insert item takes a key and a value .. so i need to store the values inorder to return them by the findAll with certain key method.

+3  A: 

Have each node contain a count: addition of duplicates will increment the count, removals will decrement the count unless it's 1, in which case the whole node will be removed.

jball
i forgot to say that the tree takes a key and a value so i have to store the values to return them in the findall method ...
Ahmed Kotb
To clarify, there are going to be different values (not duplicate values) stored for a single key? If so, your array of values solution seems good to me.
jball
Nice solution. (Extra text for stupid minimum post length).
Blank Xavier
+1  A: 

Another general approach is to internally make the value part of the key so that you don't really have duplicate keys anymore. You'll need both the key and the value anyway in order to delete an entry from a tree that allows duplicates.

To search for a key without knowing the value, you would then do something like (pseudo-code):

searchResult = myTree.SearchGreaterOrEqual(Key);
found = (searchResult != null) && (searchResult.Key == Key);
500 - Internal Server Error
nice approach :)actually we are required to make the delete method deletes all the items with that key...
Ahmed Kotb