Стратегия поиска дубликатов записей в дереве двоичного поиска

У меня есть BST, в котором есть дублирующиеся записи. Я пытаюсь найти дублирующиеся записи. Теперь очевидно, что я могу написать тупой алгоритм, который обходит все дерево, что легко.

Однако я хочу написать более эффективный алгоритм. Вот что я сделал/подумал на данный момент:

Предположим следующее дерево.

      10
     /   \
    5    15
   /\    / \
  2  8   10 16
      \    \
       8   12

Если я хочу найти все восьмерки, я сначала найду восьмерку в левом поддереве дерева 10. Чтобы найти дубликат, если у него нет правого ребенка, будет ли это самый левый узел в правом поддереве первого родителя, который больше этого узла (8)? А если у него есть правый ребенок, то он может быть либо в самом левом узле правого поддерева, либо в самом правом узле левого поддерева?

Это все случаи, которые можно решить с помощью циклов и if-выражений?

Если нет, то какой подход лучше? Кто-нибудь может помочь?

Спасибо

EDIT: На самом деле я только что понял, что это не может быть "самый левый узел" или "самый правый узел". Это будет поиск узла, который является следующим наибольшим значением или предыдущим наименьшим значением. Это будет на один узел раньше?

EDIT 2:

Исправлен мой пример BST. Он следует следующему методу вставки:

if (node == null) 
    return new NodeBST<Value>(name, value);

if (node.key().compareTo(name) > 0)
    node.setLeft(insert(node.left(), name, value));     
else
    node.setRight(insert(node.right(), name, value));

Это означает, что дубликаты будут добавлены справа от своих дубликатов... правильно?

9
задан Ciro Santilli 新疆改造中心法轮功六四事件 11 April 2015 в 09:49
поделиться