Skip to content

Commit efd70c9

Browse files
committed
re-build the tree when doing a second insert_bulk
1 parent bb6690d commit efd70c9

1 file changed

Lines changed: 18 additions & 5 deletions

File tree

src/kdtree.rs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@
2525
//! assert!(!neighbors3d.is_empty());
2626
//! ```
2727
28-
use crate::errors::SpartError;
29-
use crate::geometry::DistanceMetric;
28+
use std::{cmp::Ordering, collections::BinaryHeap};
29+
3030
use ordered_float::OrderedFloat;
3131
#[cfg(feature = "serde")]
3232
use serde::{Deserialize, Serialize};
33-
use std::cmp::Ordering;
34-
use std::collections::BinaryHeap;
3533
use tracing::info;
3634

35+
use crate::{errors::SpartError, geometry::DistanceMetric};
36+
3737
/// Trait representing a point that can be stored in the Kd‑tree implementation.
3838
///
3939
/// A type implementing `KdPoint` must provide the number of dimensions,
@@ -272,11 +272,24 @@ impl<P: KdPoint> KdTree<P> {
272272
});
273273
}
274274
}
275-
// Pass k explicitly to avoid unwraps inside recursion
275+
276+
if self.root.is_some() {
277+
let mut existing = Vec::new();
278+
Self::collect_points(&self.root, &mut existing);
279+
points.extend(existing);
280+
}
276281
self.root = Self::insert_bulk_rec(&mut points[..], 0, k);
277282
Ok(())
278283
}
279284

285+
fn collect_points(node: &Option<Box<KdNode<P>>>, result: &mut Vec<P>) {
286+
if let Some(n) = node {
287+
result.push(n.point.clone());
288+
Self::collect_points(&n.left, result);
289+
Self::collect_points(&n.right, result);
290+
}
291+
}
292+
280293
fn insert_bulk_rec(points: &mut [P], depth: usize, k: usize) -> Option<Box<KdNode<P>>> {
281294
if points.is_empty() {
282295
return None;

0 commit comments

Comments
 (0)