diff --git a/src/trees/Tree.cpp b/src/trees/Tree.cpp index 6be4e32..386d116 100755 --- a/src/trees/Tree.cpp +++ b/src/trees/Tree.cpp @@ -23,14 +23,23 @@ vector> Tree::calcLeaves() const void Tree::remove(const shared_ptr thisNode, const shared_ptr otherNode) { thisNode->deleteNode(); - - for (shared_ptr e : *thisNode->getChildren()) - { + int edgeCounter = 0; // number of edges already checked (don't have to be checked again, if getChildren() changes) + for (std::vector>::const_iterator it = thisNode->getChildren()->cbegin(); it != thisNode->getChildren()->cend();) { + size_t oldSize = thisNode->getChildren()->size(); + shared_ptr e = *it; shared_ptr eOther = otherNode->hasEdge(e); if (eOther != nullptr) { remove(e->getTarget(), eOther->getTarget()); } + // size of getChildren() can change if children are deleted and removed. In this case we need a new iterator pointing to the same address. + if (oldSize != thisNode->getChildren()->size()) { + it = thisNode->getChildren()->cbegin() + edgeCounter; + } + else { + ++edgeCounter; + ++it; + } } }