diff --git a/A1/coord_query_kdtree b/A1/coord_query_kdtree index a2b0bc7..3dab3e7 100755 Binary files a/A1/coord_query_kdtree and b/A1/coord_query_kdtree differ diff --git a/A1/coord_query_kdtree.c b/A1/coord_query_kdtree.c index 1e5b9c5..4d91029 100644 --- a/A1/coord_query_kdtree.c +++ b/A1/coord_query_kdtree.c @@ -78,36 +78,38 @@ void free_kdtree(struct node* data) { free_kdtree(right); } -void lookup(struct record** closest, double closest_dist, double query[2], struct node* tree) { +struct record* lookup(struct record* closest, double query[2], struct node* tree) { if (tree == NULL) { - return; + return closest; } double compare_coord[2] = {tree->point[0], tree->point[1]}; double dist = calc_euclidean(query, compare_coord); + + double closest_coords[2] = {closest->lon, closest->lat}; + double closest_dist = calc_euclidean(query, closest_coords); if (dist < closest_dist) { - closest = &tree->record; - closest_dist = dist; + closest = tree->record; } double diff = tree->point[tree->axis] - query[tree->axis]; if (diff >= 0 || closest_dist > fabs(diff)) { - lookup(closest, closest_dist, query, tree->left); - } else if (diff <= 0 || closest_dist > fabs(diff)) { - lookup(closest, closest_dist, query, tree->right); + closest = lookup(closest, query, tree->left); } - return; + if (diff <= 0 || closest_dist > fabs(diff)) { + closest = lookup(closest, query, tree->right); + } + + return closest; } const struct record* lookup_kdtree(struct node *data, double lon, double lat) { struct record* closest = data->record; - double compare_coord[2] = {data->point[0], data->point[1]}; double query[2] = {lon, lat}; - double closest_dist = calc_euclidean(query, compare_coord); - lookup(&closest, closest_dist, query, data); + closest = lookup(closest, query, data); return closest; }