Хорошо, учитывая класс в соответствии с
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
. - person Bernhard Barker   schedule 13.06.2013