void TarjanHD::run() { _T.clear(); NodeNodeMap mapToOrgG(_orgG, lemon::INVALID); for (NodeIt v(_orgG); v != lemon::INVALID; ++v) { mapToOrgG[v] = v; } ArcList arcs; for (ArcIt a(_orgG); a != lemon::INVALID; ++a) { arcs.push_back(a); } // sort by weight arcs.sort(Comparison(_orgW)); BoolArcMap arcFilter(_orgG, true); BoolNodeMap nodeFilter(_orgG, true); NodeNodeMap G2T(_orgG, lemon::INVALID); SubDigraph subG(_orgG, nodeFilter, arcFilter); _root = hd(_orgG, _orgW, subG, mapToOrgG, G2T, arcs, 0); fixTree(_root); }
void TwoThreeTree::remove(TNode *d) { if (root == d) { delete d; root = NULL; return; } fixTree(d, d->side); }
void TwoThreeTree::fixTwoNode(TNode *d, int s) { TNode *p = d->parent; // get d's sibling. TNode *dSib = (s == -1) ? p->middle : p->left; delete d; // base case when d's parent is root if (p == root) { root = dSib; dSib->parent = NULL; delete p; return; } // connect d's sibling to middle to unify different cases connect(dSib, p, 0); p->left = NULL; p->right = NULL; // get p's parent, which is d's grandparent TNode *g = p->parent; TNode *pSib = NULL; // get p's sibling if (g->rlow == -1) pSib = (p->side == -1) ? g->middle : g->left; else pSib = (p->side == 0) ? g->left : g->middle; if (pSib->rlow != -1) { // if p's sibling is a 3-node, call adoptchild adoptChild(p, pSib); fixLowVals(p); } else { // if p's sibling is a 2-node, call lose child loseChild(p, pSib); // recursively fix p fixTree(p, p->side); } }