//------------------------------------------------------------------------------ void TreeOrder::SortDescendants (NodePtr node) { NodePtr head = node->GetChild (); NodePtr tail = head; while (tail->GetSibling () != NULL) { NodePtr p = tail->GetSibling (); if (MustSwap (head, p)) { tail->SetSibling (p->GetSibling ()); p->SetSibling (head); head = p; p->GetAnc()->SetChild (p); } else { NodePtr q = head; NodePtr r = q->GetSibling (); while (MustSwap (p, r)) { q = r; r = q->GetSibling (); } if (p == r) tail = p; else { tail->SetSibling (p->GetSibling ()); p->SetSibling (r); q->SetSibling (p); } } } }
//------------------------------------------------------------------------------ // Add Node below Below. Doesn't update any clusters, weights, etc. void Tree::AddNodeBelow (NodePtr Node, NodePtr Below) { NodePtr Ancestor = NewNode (); Ancestor->SetChild (Node); Node->SetAnc (Ancestor); NodePtr q = Below->GetAnc (); Internals++; if (Node->IsLeaf()) Leaves++; if (q == NULL || Below == q->GetChild()) { Node->SetSibling (Below); Ancestor->SetAnc (q); Ancestor->SetSibling (Below->GetSibling()); Below->SetSibling (NULL); Below->SetAnc (Ancestor); if (q == NULL) Root = Ancestor; else q->SetChild (Ancestor); } else { // Get left sibling of Below NodePtr r = Below->LeftSiblingOf(); while (Below != r->GetSibling()) r = r->GetSibling(); Node->SetSibling (Below); Ancestor->SetAnc (q); Ancestor->SetSibling (Below->GetSibling()); Below->SetSibling (NULL); Below->SetAnc (Ancestor); r->SetSibling (Ancestor); } }
//------------------------------------------------------------------------------ void ThorneOrder::Order () { if (outgroup->GetSibling() != NULL) { NodePtr q = t->GetRoot()->GetChild()->GetRightMostSibling(); //std::cout << "OG" << outgroup->GetLabel() << std::endl; if (outgroup == t->GetRoot()->GetChild()) { t->GetRoot()->SetChild(outgroup->GetSibling()); } else { NodePtr p = outgroup->LeftSiblingOf(); p->SetSibling (outgroup->GetSibling()); } q->SetSibling (outgroup); outgroup->SetSibling (NULL); } }
NodePtr Tree::RemoveNode (NodePtr Node) { NodePtr result = NULL; if (Node == Root) { if (Leaves == 1) { Root = NULL; Node->SetAnc (NULL); Leaves = Internals = 0; } return result; } NodePtr p; NodePtr Ancestor = Node->GetAnc(); if (Ancestor->GetDegree() == 2) { // ancestor is binary, so remove node and its ancestor if (Node->IsTheChild ()) p = Node->GetSibling(); else p = Ancestor->GetChild(); NodePtr q = Ancestor->GetAnc(); p->SetAnc (q); if (q != NULL) { if (Ancestor->IsTheChild()) q->SetChild (p); else { NodePtr r = Ancestor->LeftSiblingOf (); r->SetSibling (p); } p->SetSibling (Ancestor->GetSibling()); result = p; } else { // Ancestor is the root Root = p; p->SetSibling (NULL); result = p; } delete Ancestor; Internals--; if (Node->IsLeaf()) Leaves--; Node->SetAnc (NULL); Node->SetSibling (NULL); } else { // polytomy, just remove node NodePtr q; if (Node->IsTheChild()) { Ancestor->SetChild (Node->GetSibling()); q = Node->GetSibling (); } else { q = Node->LeftSiblingOf (); q->SetSibling (Node->GetSibling ()); } Node->SetSibling (NULL); Node->SetAnc (NULL); if (Node->IsLeaf()) Leaves--; Ancestor->SetDegree (Ancestor->GetDegree() - 1); result = q; } }