k-d树最近邻搜索算法伪代码:
'''
输入:k-d树根节点root,要查询的结点target
输出:k-d树中距离target最近的结点nearest_node
'''
search(root, target):
## 1. 进行二叉查找,建立搜索路径,直到找到一个叶结点
#二分查找target结点应该落在哪个区域
cur_node = root
while cur_node != NULL:
search_stack.push(cur_node)#把cur_node压入堆栈
##更新cur_node
s = cur_node->split_dim #当前结点划分区域的维度
if target->val[s] < cur_node->val[s]:
cur_node = cur_node->left
else:
cur_node = cur_node->right
## 2. 把叶结点设为最近邻点
nearest_node = search_stack.pop() #弹出搜索堆栈放进的最后一个结点,即一个叶结点
nearest_dis = dis(nearsest_node,taget)
## 3. 回溯更新最近邻点
while search_stack != NULL:
cur_node = search_stack.pop()
if dis(cur_node,taget) < nearest_dis: # 如果cur_node到target的距离更近,更新最近邻点
nearest_node = cur_node
nearest_dis = dis(cur_node,target)
s = cur_node->split_dim
if target[s] <= cur_node[s]: #如果taget位于它的父结点的左区域,那么另外一个区域为右区域,则进入右区域搜寻最近邻点
cur_node = cur_node->left #如果taget位于它的父结点的右区域,那么另外一个区域为左区域,则进入左区域搜寻最近邻点
else:
cur_node = cur_node->right
search_stack.push(cur_node) #把更新后的cur_node压入搜索堆栈
return nearest_node