我很难掌握如何迭代八叉树或四边形。这可能是因为我没有经历过不同的迭代神话。但是我们假设我生成了一个四叉树,它包含浮点x,y,z;双色。现在,让我们也说这个节点一次只能生产4个孩子(这些孩子可以生产4个孩子等等),直到达到7个等级(这样孩子就不能再生孩子了,但是兄弟/姐妹们可以),所有创建的4个孩子都是相同的双色(再次,如果发生这种情况,它的兄弟/姐妹仍然可以产生),或者创建的总节点数等于87380.当上述情况发生时,它被置于一个容器。这个过程还在继续。
现在这个容纳节点的容器(例如)有7层深,所有孩子的孩子都有不同的x,y,zs和颜色。我遇到的问题是我如何迭代这个容器,我怎么能经历所有的孩子,姐妹?由于根导致4个孩子,这4个孩子有4个孩子等,等等:4 ^ 1 + 4 ^ 2 .... + 4 ^ 7。如何在不编写复杂的if语句的情况下找到我想要的节点,并迭代整个节点(从root开始)?容器(生成节点的容器)是否需要额外的代码才能使这个过程变得简单?
很抱歉,如果问题一般。
答案 0 :(得分:4)
迭代整个树很容易,你可以递归地进行。
void iterate(node *n) {
// do something with n
if (n->child1 != NULL) iterate(n->child1);
if (n->child2 != NULL) iterate(n->child2);
if (n->child3 != NULL) iterate(n->child3);
if (n->child4 != NULL) iterate(n->child4);
}
然后拨打iterate(root)
,do something
将在四叉树中的每个节点上发生。
我怀疑这不是你所要求的。如果您正在做的就是将数据保存在四叉树中没有意义。如果您想在四叉树中找到特定节点,那么您还需要其他东西。假设你想在四叉树中找到一个点x,y
。然后你做了类似的事情:
void find(node *n, float x, float y) {
if (x == n->x && y == n->y) // you've found it!
if (x < n->x) {
if (y < n->y) {
if (n->child1 != NULL) {
find(n->child1, x, y);
} else {
// point not in quadtree
}
} else {
...same, but child2
}
} else {
...same, child3 & 4
}
}
请注意,四叉树通常不会在它们自己存储的点上分割,它们通常通过将分割坐标与点(仅存储在四叉树的叶子中)分开存储来分割。有关示例,请参阅wikipedia picture。