radzenia sobie z duplikatów w BST

głosy
2

Mój bst musi być w stanie poradzić sobie ze zduplikowanych wpisów. Czy ktoś ma jakieś strategie, jak go o to, że nie wymaga nadmiernych ilości kodu? Myślałem o konsekwentnie dodanie duplikaty w prawo, ale potem, że będzie bałagan kolejność BST. na przykład, co się dzieje, gdy duplikat ma dwoje dzieci, którzy z kolei mają dwoje dzieci ?. włożeniem duplikat jest na tyle łatwe, ale to, co jest do zrobienia z węzłem zastąpił?

Utwórz 10/10/2009 o 08:51
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
2

Można zrobić węzły wyszukiwania binarnego drzewa w połączonych listach.

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>();    
}

Tutaj treeNode.itemszawsze jest niepusty lista, tak że item1.compareTo(item2) == 0dla każdego item1i item2w treeNode.items.

Aby wstawić duplikat elementu, by znaleźć odpowiedni TreeNodeobiekt i dodać nowy element do items.

Logika znalezienie elementów jest prawie taka sama jak przedtem, tyle że po znalezieniu odpowiedniego TreeNodeobiektu trzeba chodzić połączonej listy.

Odpowiedział 10/10/2009 o 13:17
źródło użytkownik

głosy
3

Tak długo, jak nie jest to samo balansowanie BST, nie widzę problemu z wprowadzenia równych węzły albo na lewo lub prawo od węzła, który jest równy do nich.

Edit (po uwagą simonn użytkownika):

Jeśli „duplikat węzeł” posiada już 2 dzieci, a potem po prostu włóż „nowy duplikat węzeł” po lewej stronie i niech lewa dziecko „starej duplikatu węzła” stać lewa dziecko „nowego duplikatu węzła”.

Pozwól mi wyjaśnić na przykładzie. Drzewo przed włożeniem duplikat:

    4'
   / \
  2   5
 / \
1   3

A teraz element 4''w brzmieniu:

      4'
     / \
    4'' 5
   /
  2   
 / \
1   3

Dopóki drzewo nie jest równoważenie samo powinno być w porządku.

Odpowiedział 10/10/2009 o 13:37
źródło użytkownik

głosy
0

Zastanawiam się, czy rzeczywiście trzeba przechowywać zduplikowane wpisy jako oddzielne węzły? Czy dodanie zmiennej licznika do węzła wystarczy? W ten sposób, jeśli przemierzać drzewo wiedziałbyś liczbę zduplikowane wpisy i nadal zachować kolejność.

Odpowiedział 21/06/2012 o 19:26
źródło użytkownik

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