これでうまくいくと思います。しかし実際には、ダリウスは正しい。有効なツリー トラバーサルを使用し、各ノードで操作を実行するだけです。
質問が変更されました: そして、これをツリー内の任意のノードで操作したいので、最初にルートを見つけてください。ツリーを上ったり下ったりするよりも、一方向に進むツリー トラバーサルを書く方がはるかに簡単です。
質問をツリーの削除からツリーのサブセットの削除に変更しました。では、代わりにこうしましょう。最初にツリーから要素を削除します (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);
}