Also ich versuche, einen Algorithmus zu implementieren, um durch einen Intervall-Suchbaum zu gehen und alle Schnittpunkte zu finden. Ich konnte Knoten ohne Probleme erstellen und einfügen, aber der Algorithmus, den ich durch den Baum gehen muss, sucht derzeit nur nach einem Intervall, das das Abfrageintervall schneidet. Wenn beispielsweise (21, 23) als der Abfrageparameter übergeben wurde, würde der Baum den Knoten 16, 22 als eine Kreuzung finden, aber den Knoten, der sich derzeit rechts von dem Wurzelknoten befindet, außer Acht lassen. Irgendwelche Ideen, wie ich einen Algorithmus machen kann, um JEDEN Knoten zu finden, mit dem sich die Abfrage schneidet?Alle Schnittpunkte im Interval Binary Search Tree
https://gist.github.com/anonymous/ce4e40e9d9e4af27d66690dcc16245a3
Aktualisierte Version, die für alle Kreuzungen
I-Knoten entfernen entschieden prüft, wenn sie in dem Algorithmus gefunden werden, die für eine Kreuzung überprüft, bis sie null zurück.
https://gist.github.com/DandroidDeveloper/009717551e3785cde48a53ffdeded7d1
function checkIntersection(interval, tree){
var currentNode = tree.root;
var intersection = {};
while(currentNode){
console.log("Searching...", currentNode);
if (currentNode.list.length > 0){
for (var i = 0; i < currentNode.list.length; i++){
if (interval[0] < currentNode.list[i].interval[1] && currentNode.list[i].interval[0] < interval[1]){
intersection.interval = currentNode.list[i].interval;
intersection.id = currentNode.list[i].id;
tree.remove(currentNode.list[i].interval, currentNode.list[i].id);
return intersection;
}
}
}
if (interval[0] < currentNode.interval[1] && currentNode.interval[0] < interval[1]){
console.log("INTERSECTION: "+interval, currentNode.interval);
intersection.interval = currentNode.interval;
intersection.id = currentNode.id;
tree.remove(currentNode.interval, currentNode.id);
return intersection;
}
if (!currentNode.left){
console.log("NO NODE TO LEFT, GO RIGHT");
if (!currentNode.right){
console.log("NO MORE NODES");
return null;
}
console.log(currentNode.right);
currentNode = currentNode.right;
}
else if (currentNode.left.max < interval[0]){
console.log("LEFT MAX: "+currentNode.left.max+" < "+interval[0]+" GO RIGHT");
currentNode = currentNode.right;
}
else{
console.log("INTERVAL MAY BE TO LEFT, GO LEFT");
currentNode = currentNode.left;
}
}
}
function checkAllIntersections(interval, tree){
var intersections = [];
var flag = true;
while(flag){
var temp = checkIntersection(interval, tree);
if (!temp){
flag = false;
}
else{
intersections.push(temp);
}
}
for (var i = 0; i < intersections.length; i++){
tree.add(intersections[i].interval, intersections[i].id);
}
return intersections;
}
Also zur Zeit ich auf dem gehen durch den Baum arbeite und einfach die schneidende Knoten zu löschen und sie zu einem Array hinzufügen ..... Wenn jemand einen besseren Vorschlag hat lassen ich weiß es! –
Mit anderen Worten, erstellen Sie einen Baum, suchen Sie nach Schnittpunkten, wenn Sie einen finden, schieben Sie ihn auf ein Array, entfernen Sie ihn aus der Baumstruktur und rekursiv, bis keine Schnittpunkte vorhanden sind, und fügen Sie dann alle Knoten im Array wieder in den Baum ein .... –
Bitte geben Sie den Algorithmus an, mit dem Sie derzeit den Baum durchsuchen. Es kann wahrscheinlich modifiziert werden, um mehr als einen Knoten zurückzugeben - aber die Leute müssen den Algorithmus selbst sehen, um Ihnen dabei zu helfen. –