Recursion 从树上的递归到数组上的迭代(kd树最近邻)

Recursion 从树上的递归到数组上的迭代(kd树最近邻),recursion,nearest-neighbor,kdtree,Recursion,Nearest Neighbor,Kdtree,我有一个递归函数(在树上),我需要使它在没有递归的情况下工作,并将树表示为隐式数据结构(数组) 以下是函数: kdnode* kdSearchNN(kdnode* here, punto point, kdnode* best=NULL, int depth=0) { if(here == NULL) return best; if(best == NULL) best = here; if(distance(here, point) < distance(bes

我有一个递归函数(在树上),我需要使它在没有递归的情况下工作,并将树表示为隐式数据结构(数组)

以下是函数:

kdnode* kdSearchNN(kdnode* here, punto point, kdnode* best=NULL, int depth=0)
{   
if(here == NULL)
    return best;

if(best == NULL)
    best = here;

if(distance(here, point) < distance(best, point))
    best = here;

int axis = depth % 3;

kdnode* near_child = here->left;
kdnode* away_child = here->right;

if(point.xyz[axis] > here->xyz[axis])
{
    near_child = here->right;
    away_child = here->left;
}

best = kdSearchNN(near_child, point, best, depth + 1);

if(distance(here, point) < distance(best, point))
{
    best = kdSearchNN(away_child, point, best, depth + 1);
}

return best;
}

这就是我所做的:

punto* kdSearchNN_array(punto *tree_array, int here, punto point, punto* best=NULL, int depth=0, float dim=0)
{
if (here > dim) {
    return best;
}

if(best == NULL)
    best = &tree_array[here];

if(distance(&tree_array[here], point) < distance(best, point))
    best = &tree_array[here];

int axis = depth % 3;

int near_child = (here*2)+1;
int away_child = (here*2)+2;

if(point.xyz[axis] > tree_array[here].xyz[axis])
{
    near_child = (here*2)+2;
    away_child = (here*2)+1;
}

best = kdSearchNN_array(tree_array, near_child, point, best, depth + 1, dim);

if(distance(&tree_array[here], point) < distance(best, point))
{
    best = kdSearchNN_array(tree_array, away_child, point, best, depth + 1, dim);
}

return best;
}
punto*kdSearchNN\u数组(punto*tree\u数组,此处为int,punto-point,punto*best=NULL,int-depth=0,float-dim=0)
{
如果(此处>变暗){
回报最好;
}
如果(最佳==NULL)
最佳=&tree_数组[此处];
if(距离(&树数组[此处],点)<距离(最佳,点))
最佳=&tree_数组[此处];
int轴=深度%3;
int near_child=(此处*2)+1;
int away_child=(这里*2)+2;
if(point.xyz[axis]>树数组[here].xyz[axis])
{
near_child=(此处*2)+2;
离开孩子=(这里*2)+1;
}
最佳=kdSearchNN_数组(树_数组,近_子数组,点,最佳,深度+1,尺寸);
if(距离(&树数组[此处],点)<距离(最佳,点))
{
best=kdSearchNN_数组(树_数组、远_子数组、点、最佳、深度+1、尺寸);
}
回报最好;
}
现在最后一步是摆脱递归,但我找不到方法,有什么提示吗?
谢谢

您总是自我重现,所以您可以将整个函数体包装在一个循环中,在您想要继续搜索的地方,只需设置新参数并继续循环

punto* kdSearchNN_array(punto *tree_array, int here, punto point, punto* best=NULL, int depth=0, float dim=0)
{
if (here > dim) {
    return best;
}

if(best == NULL)
    best = &tree_array[here];

if(distance(&tree_array[here], point) < distance(best, point))
    best = &tree_array[here];

int axis = depth % 3;

int near_child = (here*2)+1;
int away_child = (here*2)+2;

if(point.xyz[axis] > tree_array[here].xyz[axis])
{
    near_child = (here*2)+2;
    away_child = (here*2)+1;
}

best = kdSearchNN_array(tree_array, near_child, point, best, depth + 1, dim);

if(distance(&tree_array[here], point) < distance(best, point))
{
    best = kdSearchNN_array(tree_array, away_child, point, best, depth + 1, dim);
}

return best;
}