Mein bst hat mit doppelten Einträgen bewältigen zu können. Hat jemand irgendwelche Strategien, wie um dies zu realisieren, die keine übermäßigen Mengen an Code benötigt? Ich dachte an konsequent Duplikate nach rechts Zugabe dann aber das wird Chaos der bst Ordnung auf. zum Beispiel, was passiert, wenn die doppelte zwei Kinder, die wiederum haben zwei Kinder hat ?. das Duplikat Einfügen ist leicht genug, aber was ist mit dem Knoten durchgeführt werden, um es ersetzt?
Umgang mit Dubletten in einem bst
Sie könnten die Knoten des binären Suchbaum in verkettete Listen machen.
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>();
}
Hier treeNode.itemsist immer eine nicht-leere Liste, so dass item1.compareTo(item2) == 0für jeden item1und item2in treeNode.items.
Um ein Duplikat Element einzufügen, würden Sie das entsprechende finden TreeNodeObjekt und ein neues Element hinzufügen items.
Die Logikelemente zu finden , ist fast die gleiche wie Sie zuvor, außer dass , wenn Sie die entsprechenden finden TreeNodeObjekt Sie die verknüpfte Liste zu gehen haben.
Solange es Ausgleich BST kein Selbst ist, sehe ich nicht ein Problem mit dem gleichen Knoten setzen entweder auf der linken oder rechten Seite des Knotens, der gleich ihnen.
Bearbeiten (nach Simonn Bemerkung):
Wenn der „doppelte Knoten“ in Frage bereits zwei Kinder hat, dann legen Sie einfach den „neuen doppelten Knoten“ nach links und lassen Sie das linke Kind des „alten doppelten Knoten“ wird das linke Kind des „neuen doppelten Knoten“.
Lassen Sie mich mit einem Beispiel verdeutlichen. Der Baum vor einem Duplikat einfügen:
4'
/ \
2 5
/ \
1 3
Und nun das Element 4''eingefügt:
4'
/ \
4'' 5
/
2
/ \
1 3
Solange der Baum nicht selbst Balancing ist, sollten Sie in Ordnung sein.
Ich frage mich, ob Sie tatsächlich die doppelten Einträge als separater Knoten speichern müssen? Würde das Hinzufügen einer Zählvariable zu Ihrem Knoten genug sein? Auf diese Weise, wenn Sie den Baum durchqueren würden Sie die Anzahl der doppelten Einträge kennen und immer noch den Auftrag erhalten.













