我想这会奏效。但实际上,大流士是正确的。您只需使用有效的树遍历,并在每个节点上执行您的操作。
问题变了: 既然您希望它在树中的任何节点上运行,只需先找到根。编写一个在一个方向上进行的树遍历比在树上上下移动要容易得多。
您已将问题从删除树更改为删除树的子集。所以,相反,让我们这样做。首先从树中删除元素(remove_node)。然后执行与我们之前相同的自由操作。
void remove_node(node *self) {
if (self->previousSibling)
self->previousSibling->nextSibling = self->nextSibling;
if (self->nextSibling)
self->nextSibling->previousSibling = self->previousSibling;
if (self->parent && self->parent->firstChild == self)
self->parent->firstChild = self->nextSibling;
if (self->parent && self->parent->lastChild == self)
self->parent->lastChild = self->previousSibling;
}
void free_node(node *self) {
// Free one node. Perhaps this is:
free(self->name);
free(self->text);
free(self);
}
void iterate_nodes(node *root, void op(node *self) ) {
if (root == NULL)
return;
iterate_nodes(root->nextSibling, op);
iterate_nodes(root->firstChild, op);
op(root);
}
int main() {
node *node = NULL; // Some node in the tree...
remove_node(node);
iterate_nodes(node, free_node);
}