Exemple #1
0
//--------------------------------------------------------------------------------------------------------------------
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;
  }
}
Exemple #2
0
//--------------------------------------------------------------------
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;
  }
}