//-------------------------------------------------------------------------------------------------------------------- void Tree::remove (Tree::Node* n) throw (Tree::NonexistentNode, Tree::DeletingRootOfNonSingletonTree, Tree::EmptyNode) { if (n == 0) throw EmptyNode(); if ((n == root_node) && (!edge_set.empty() || (node_set.size() > 1))) throw DeletingRootOfNonSingletonTree(n); if (node_set.erase(n) == 0) throw NonexistentNode(n); preorder_needed = postorder_needed = rpostorder_needed = true; n->in_use = false; if (n == root_node) root_node = 0; if (n->incoming != 0) { edge_set.erase(n->incoming); deque_erase<Edge*>(n->incoming->parent_node->outgoing, n->incoming); delete n->incoming; // an edge has no existence without its anchoring nodes } OutEdgesIterator out(n); while ((bool)out) { Edge* e = (Edge*)out; e->child_node->incoming = 0; edge_set.erase(e); delete e; // an edge has no existence without its anchoring nodes ++out; } }
//-------------------------------------------------------------------- void Tree::removeNode (OA_ptr<Tree::Node> n) throw (Tree::NonexistentNode, Tree::DeletingRootOfNonSingletonTree, Tree::EmptyNode) { if (n.ptrEqual(0)) { throw EmptyNode(); } if ((n.ptrEqual(root_node)) && (!edge_set->empty() || (node_set->size() > 1))) throw DeletingRootOfNonSingletonTree(n); if (node_set->erase(n) == 0) throw NonexistentNode(n); preorder_needed = postorder_needed = rpostorder_needed = true; n->in_use = false; if (n == root_node) root_node = 0; if (! n->incoming.ptrEqual(0)) { edge_set->erase(n->incoming); deque_erase<OA_ptr<Edge> >(*(n->incoming->parent_node->outgoing), n->incoming); } OutEdgesIterator out(*n); while (out.isValid()) { OA_ptr<Edge> e = out.current(); e->child_node->incoming = 0; edge_set->erase(e); ++out; } }