【发布时间】:2013-06-13 09:59:16
【问题描述】:
好的,给定一个类
class quadTree {
short level;
Vec2f midpoint;
quadTree * nodes[4] = { NULL, NULL, NULL, NULL};
public:
void newPartition() {
float j = fWIDTH / 2 ^ level;
float k = fHEIGHT / 2 ^ level;
nodes[0] = new quadTree(level+1, midpoint[0] - j, midpoint[0] + k);
nodes[1] = new quadTree(level+1, midpoint[0] + j, midpoint[0] + k);
nodes[2] = new quadTree(level+1, midpoint[0] - j, midpoint[0] - k);
nodes[3] = new qaudTree(level+1, midpoint[0] + j, midpoint[0] - k);
}
}
我如何实现一个函数来删除四叉树当前节点下的所有节点而不使用可能使用队列的递归?就像在 Clear() 函数中一样。
对不起,我觉得我应该知道这一点,只是无法弄清楚。我在网上看了,但找不到任何东西。有什么想法吗?
对于任何使用队列的示例代码,只需使用 std::queue。
编辑:: 好的,我认为这就是我要用作参考的内容。我认为这应该可行,如果我错了,请纠正我。
#include <queue>
void helpClear( bool notPassing, queue<quadTree> &q ) {
int count;
for ( int i; i < 4; i++ ) {
if ( node[i] != NULL){
q.push ( node[i] );
count++;
}
}
quadTree * Point;
if ( notPassing ){
for ( int i; i < count; i++ ){
Point = q.front();
q.pop();
Point -> helpClear(0, q);
}
for ( int i; i < 4; i ++ )
delete nodes[i];
}
}
void clear () {
queue <quadTree> q;
quadTree * Point;
helpClear(1,q);
while (!queue.empty() ) {
quadTree * Point;
Point = q.front();
q.pop();
Point -> helpClear(1,q);
delete Point;
}
for ( int i; i < 4; i++ )
nodes[i] = NULL;
}
helpClear() 是 quadTree 的私有函数,而 clear() 是您调用的公共函数,用于删除当前节点下的所有节点。
【问题讨论】:
-
虽然避免递归通常不是一个坏主意,但我很确定这是一个很好的例子,“但避免递归并不总是一个好主意”。 - 在这种情况下,递归将比将要删除的对象堆叠到队列中然后删除队列要容易得多。
-
我正在处理大量的四叉树和大量数据,这些数据可能会给堆栈带来不同的压力。我说的是如果我只是递归地调用他们的解构函数我可能会导致段错误的大小。你知道我该怎么做吗?
-
这似乎很奇怪,因为四叉树的全部意义在于没有那么多层级,这使得递归相当浅。
-
Point = q.front(); q.pop();可以只是Point = q.pop();。并且通常首选的方法是将其粘贴在析构函数中(它仍然是递归的,但这不太可能成为问题 - 10000 的深度对于递归应该没有问题,这意味着,对于一个有点平衡的树,更多的节点可能曾经可以放入内存(我的计算表明5*10^3624个节点))。并且类名一般以大写字母开头 -QuadTree. -
您假设该程序堆栈中唯一的东西是四叉树,但事实并非如此。你也不能替换 Point = q.front(); q.pop();只需点 = q.pop(); cplusplus.com/reference/queue/queue/pop 不与 std::queue 一起使用。是的,我知道他们这样做,但我总是最终给他们小写的第一个单词,然后是大写的单词。这是一种习惯。
标签: c++ algorithm tree queue quadtree