我有一个八叉树,我必须删除它所搜索的节点的分支。该程序可以找到节点,但我很难删除它。当我创建一个Octree的对象并创建一些节点但我不删除它们时,析构函数就删除了八叉树:
Octree::~Octree()
{
clear(root);
}
void Octree::clear(node *node){
for (int i = 0; i < 8; i++)
if (node->child[i])
clear(node->child[i]);
delete node;
}
但是当我想用这种方法删除一个具体的节点时,
void Octree::deletebranch(int branch) {
node *n = search(branch);
if (n) {
for (int i = 0; i < 8; i++) {
if (n->child[i]) {
delete n->child[i];
n->child[i] = NULL;
}
}
delete n;
n = NULL;
}
else {
printf("There is nothing to delete here");
}
}
析构函数调用后我得到了一个异常。 抛出异常:读取访问冲突。 节点是0x4。
我一步一步地调试,发现了一些奇怪的事情。当我创建节点时,我这样做:
n = new node;
n->value = xvalue;
for (int i = 0; i < 8; i++)
n->child[i] = NULL;
没关系,我设置了值,节点的值是xvalue,子节点是NULL。但是在用deletebranch()方法删除了那个节点后,我的节点发生了这样的变化。
我真的不明白为什么会这样,因为我删除它后从未更改过节点。 而且我认为这就是我在析构函数中得到异常的原因。我该如何删除节点?也许尝试捕捉?
这是头文件:
class Octree
{
public:
struct node
{
int value;
node *child[8];
};
Octree();
~Octree();
void clear(node* node);
int convert(int sorszam);
node* searchandset(int dec, int value);
node *search(int dec);
node* step(node *node, int k);
void Print(node *n)const;
void put(int branch, int value);
void deletebranch(int branch);
node *root;
};