У меня есть BST, в котором есть повторяющиеся записи. Я пытаюсь найти повторяющиеся записи. Теперь, очевидно, я могу написать тупой алгоритм, который пересекает все дерево, что легко.
Однако я хочу написать более эффективный. Вот что я сделал / подумал до сих пор:
Предположим следующее дерево.
10
/ \
5 15
/\ / \
2 8 10 16
\ \
8 12
Если я хочу найти все 8, я сначала найду 8 в левом поддереве из 10. Чтобы найти дубликат, если у него нет правого потомка, это будет самый левый узел справа -дерево первого родителя, который больше этого узла (8)? И если у него был правый потомок, то он может находиться либо в самом левом узле своего правого поддерева, либо в самом правом узле левого поддерева?
Это все случаи, которых можно достичь с помощью набора циклов и операторов if?
Если нет, то какой подход лучше? Кто-нибудь может помочь?
Спасибо
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));
Это означает, что дубликаты будут добавлены справа от их дубликатов .. верно?