дело с дубликатами в BST

голоса
2

Мой BST должен быть в состоянии справиться с повторяющимися записями. Кто-нибудь есть какая-либо стратегия, как идти об этом, что не требует чрезмерного количества кода? Я думал последовательно добавляя дубликаты вправо, но тогда испортит БСТ порядок. например, что происходит, когда Дубликат имеет двое детей, которые в свою очередь, имеют двоих детей ?. вставив дубликат достаточно легко, но то, что должно быть сделано с узлом его заменить?

Задан 10/10/2009 в 08:51
источник пользователем
На других языках...                            


3 ответов

голоса
2

Вы могли бы сделать узлы бинарного дерева поиска в связанные списки.

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

Здесь treeNode.itemsвсегда непустой список, таким образом, что item1.compareTo(item2) == 0для каждого item1и item2в treeNode.items.

Для того, чтобы вставить дубликат элемента, вы бы найти соответствующий TreeNodeобъект и добавить новый элемент items.

Логика нахождения элементов почти такие же , как вы были раньше, за исключением того, что как только вы нашли соответствующий TreeNodeобъект , вы должны ходить по списку.

Ответил 10/10/2009 в 13:17
источник пользователем

голоса
3

До тех пор пока это не само балансирования BST, я не вижу проблемы с положить равные узлы либо слева или справа от узла, равные им.

Edit (после того, как замечание simonn в):

Если «дубликат узла» в вопросе уже есть 2 детей, а затем просто вставить «новый узел дубликата» слева, и пусть левый потомок «старого дубликат узла» стать левым потомком «нового дубликат узла».

Поясню на примере. Дерево перед вставкой дубликат:

    4'
   / \
  2   5
 / \
1   3

А теперь элемент 4''вставляется:

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

Пока дерево не является само собой балансирование, вы должны быть в порядке.

Ответил 10/10/2009 в 13:37
источник пользователем

голоса
0

Интересно, если вы на самом деле нужно хранить дубликаты записей в виде отдельных узлов? Будет ли добавить переменный счетчик для вашего узла будет достаточно? Таким образом, если вы обход дерева вы бы знать количество повторяющихся записей и до сих пор сохраняете порядок.

Ответил 21/06/2012 в 19:26
источник пользователем

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