//------------------------------------------------------------------------------ void Tree::getNodeHeights(NodePtr p) { if (p) { p->SetHeight (Leaves - p->GetWeight ()); if (p->GetHeight() > MaxHeight) MaxHeight = p->GetHeight(); getNodeHeights (p->GetChild()); getNodeHeights (p->GetSibling()); } }
//------------------------------------------------------------------------------ void Tree::drawPendantEdge (NodePtr p) { NodePtr q = p->GetAnc(); if (q == NULL) { // Handle the degenerate case of a tree with a single leaf Line = (char) HBAR; drawLine (p); } else { int start = q->GetHeight(); int stop = p->GetHeight(); char symbol; // Draw line between p and its ancestor int i; for (i = start + 1; i <= stop; i++) Line[i] = (char)HBAR; // € // Find appropriate symbol for link to ancestor if (p == q->GetChild()) { symbol = (char)LEFT; // ò } else { // p is a sibling if (p->GetSibling()) symbol = (char)SIB; // Ì else symbol = (char)RIGHT; // Ë } Line[start] = symbol; // Fill in ancestors fillInAncestors (p); // Terminate line Line[stop + 1] = '\0'; drawLine (p); /* // Output line and taxon name *treeStream << Line.c_str() << " " << p->GetLabel () // << "h=" << p->GetHeight() << " w= " // << p->GetWeight() <<endl; */ // Clear the line for the next pass for (i = 0; i < (Leaves + 2); i++) // to do: get a better limit for this Line[i] = ' '; } }
//------------------------------------------------------------------------------ void Tree::fillInAncestors (NodePtr p) { NodePtr q = p->GetAnc (); NodePtr r = p; while (q != Root) { if ( (q->GetSibling () && !(r->IsTheChild ())) || (!(q->IsTheChild ()) && r->IsTheChild()) ) { if (r ==p && q->GetHeight() == q->GetAnc()->GetHeight()) Line[q->GetAnc()->GetHeight()] = SIB; else Line[q->GetAnc()->GetHeight()] = VBAR; } r = q; q = q->GetAnc (); } }
//------------------------------------------------------------------------------ void Tree::drawInteriorEdge (NodePtr p) { NodePtr r = p->GetAnc (); int stop = r->GetHeight(); if (p->IsTheChild ()) { // Visiting ancestor for the first time, so draw the // end symbol if (r == Root) { // if (IsRooted ()) Line[stop] = TEE; // « // else // Line[stop] = VBAR; // Ò } else { Line[stop] = TEE; // « } // Draw branch itself if (r != Root) { // Line int start = r->GetAnc()->GetHeight(); for (int i = start + 1; i < stop; i++) { Line[i] = HBAR; // € } // Start symbol if (start == stop) Line[start] = VBAR; // Ò else if (r->IsTheChild ()) Line[start] = LEFT; // ò else if (r->GetSibling ()) Line[start] = SIB; // Ì else Line[start] = RIGHT; // Ë // fillInAncestors (r); } } else { // Just draw nodes below Line[stop] = VBAR; fillInAncestors (p->GetSibling()); } // Output the line Line[stop + 1] = '\0'; drawLine (r, p->IsTheChild()); /* *treeStream << Line.c_str(); // *treeStream << "h=" << r->GetHeight() << " w= " // << r->GetWeight() << "-- "; // Draw internal label, if present string s = r->GetLabel(); if (s != "" && p->IsTheChild ()) *treeStream << r->GetLabel(); *treeStream << endl; */ // Clear the line for the next pass for (int i = 0; i < (Leaves + 2); i++) // to do: get a better limit Line[i] = ' '; }