mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-27 23:11:09 +00:00
36 lines
1023 B
Python
36 lines
1023 B
Python
|
from data_structures.kd_tree.kd_node import KDNode
|
||
|
|
||
|
|
||
|
def build_kdtree(points: list[list[float]], depth: int = 0) -> KDNode | None:
|
||
|
"""
|
||
|
Builds a KD-Tree from a list of points.
|
||
|
|
||
|
Args:
|
||
|
points: The list of points to build the KD-Tree from.
|
||
|
depth: The current depth in the tree
|
||
|
(used to determine axis for splitting).
|
||
|
|
||
|
Returns:
|
||
|
The root node of the KD-Tree,
|
||
|
or None if no points are provided.
|
||
|
"""
|
||
|
if not points:
|
||
|
return None
|
||
|
|
||
|
k = len(points[0]) # Dimensionality of the points
|
||
|
axis = depth % k
|
||
|
|
||
|
# Sort point list and choose median as pivot element
|
||
|
points.sort(key=lambda point: point[axis])
|
||
|
median_idx = len(points) // 2
|
||
|
|
||
|
# Create node and construct subtrees
|
||
|
left_points = points[:median_idx]
|
||
|
right_points = points[median_idx + 1 :]
|
||
|
|
||
|
return KDNode(
|
||
|
point=points[median_idx],
|
||
|
left=build_kdtree(left_points, depth + 1),
|
||
|
right=build_kdtree(right_points, depth + 1),
|
||
|
)
|