如何迭代一个四核/月树(How to iterating a Quad/Oct tree)

2019-09-19 11:36发布

我有困难的时候掌握如何遍历八叉树或四。 它可能是因为我不与迭代的不同神话经历。 但是,让我们假设,我公司生产的持有浮动X,Y,Z四叉树; DWORD颜色。 现在,让我们也说这个节点只能一次生4个孩子(和那些孩子们既可以生产4个孩子,等,等),直到7个水平达到了(这样的孩子不能再创造的孩子,但其兄弟/姐妹可以),创建的所有4个孩子是相同的双字的颜色(再次,如果出现这种情况,其兄弟/姐妹仍可产生),或创建的总节点是等于87380.当上述情况发生时,它被放置成容器。 并且该过程继续。

现在此容器保持该节点是(例如)7个级别深度,儿童的所有不同的x,y,ZS和颜色的孩子的所有儿童。 我遇到的问题是我如何遍历这个容器,我怎么能去通过所有的孩子,姐妹吗? 由于根导致4个孩子,而那些4个孩子有4个孩子,等等,等等等等:4 ^ 1 + 4 ^ 2 .... + 4 ^ 7。 我怎样才能找到我想要的节点,而无需编写复杂的if语句,并遍历整个节点(从根部开始)? 是否所述容器(其产生该节点的一个)需要额外的码,使该过程是简单的?

很抱歉,如果问题是一般。

Answer 1:

遍历整个树很容易,你可以递归做到这一点。

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
    }
}

需要注意的是四叉树一般都不会分裂他们自己存储的点,他们通常是将分裂分裂从点(其中仅存储在四叉树的叶子)分别坐标。 参见维基百科图像的一个例子。



文章来源: How to iterating a Quad/Oct tree