Die Idee ist einfach.
- Die BST ausgehend von der Wurzel durchlaufen.
- Überprüfen Sie für jeden Knoten, ob er in Reichweite liegt. Wenn es im Bereich liegt, dann zähle ++. Und wiederkehren für beide seiner Kinder.
- Wenn der aktuelle Knoten kleiner als der niedrige Wert des Bereichs ist, dann wiederholen Sie für das rechte Kind, andernfalls wiederholen Sie für das linke Kind.
Zeitkomplexität O(height + number of nodes in range)
sein ..
Für Ihre Frage, warum es nicht O(n)
ist.
Da wir nicht den gesamten Baum durchlaufen, ist dies die Anzahl der Knoten im Baum. Wir durchlaufen nur den erforderlichen Teilbaum gemäß den Daten des Elternteils.
Pseudocode
int findCountInRange(Node root, int a, int b){
if(root==null)
return 0;
if(root->data <= a && root->data >= b)
return 1 + findCountInRange(root->left, a, b)+findCountInRange(root->right, a, b);
else if(root->data < low)
return findCountInRange(root->right, a, b);
else
return findCountInRange(root->left, a, b);
}
Warum lassen Sie nicht einfach jeden Knoten eine Variable mit der Anzahl der Knoten im darunterliegenden Teilbaum verwalten? – aioobe
Sie können N Dinge nicht in LogN Zeit zählen - Sie müssen die Informationen bereits erstellt haben, als Sie den Baum erstellt haben. – xaxxon
Erweiterte Suchbäume? – Pinhead