Мой BST должен быть в состоянии справиться с повторяющимися записями. Кто-нибудь есть какая-либо стратегия, как идти об этом, что не требует чрезмерного количества кода? Я думал последовательно добавляя дубликаты вправо, но тогда испортит БСТ порядок. например, что происходит, когда Дубликат имеет двое детей, которые в свою очередь, имеют двоих детей ?. вставив дубликат достаточно легко, но то, что должно быть сделано с узлом его заменить?
дело с дубликатами в BST
Вы могли бы сделать узлы бинарного дерева поиска в связанные списки.
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объект , вы должны ходить по списку.
До тех пор пока это не само балансирования BST, я не вижу проблемы с положить равные узлы либо слева или справа от узла, равные им.
Edit (после того, как замечание simonn в):
Если «дубликат узла» в вопросе уже есть 2 детей, а затем просто вставить «новый узел дубликата» слева, и пусть левый потомок «старого дубликат узла» стать левым потомком «нового дубликат узла».
Поясню на примере. Дерево перед вставкой дубликат:
4'
/ \
2 5
/ \
1 3
А теперь элемент 4''вставляется:
4'
/ \
4'' 5
/
2
/ \
1 3
Пока дерево не является само собой балансирование, вы должны быть в порядке.
Интересно, если вы на самом деле нужно хранить дубликаты записей в виде отдельных узлов? Будет ли добавить переменный счетчик для вашего узла будет достаточно? Таким образом, если вы обход дерева вы бы знать количество повторяющихся записей и до сих пор сохраняете порядок.













