#include #include #include // ----------------------------------------------------------------------- // subtree manipulation methods error phylo·addchild(bio·Node* parent, bio·Node* child) { bio·Node *it, *sibling; switch (parent->nchild) { case 1: parent->child[0]->sibling = child; case 0: parent->child[parent->nchild++] = child; break; default: sibling = parent->child[1]; for (it = parent->child[1]->sibling; it != nil; it = it->sibling) { sibling = it; } sibling->sibling = child; parent->nchild++; } child->parent = parent; return 0; } error phylo·countnodes(bio·Node *node, int *n) { error err; bio·Node *child; *n += 1; for (child = node->child[0]; child != nil; child = child->sibling) { if (err = phylo·countnodes(child, n), err) { errorf("node count: failure at '%s'", child->name); return 1; } } return 0; } error phylo·countleafs(bio·Node *node, int *n) { error err; bio·Node *child; if (node->nchild) { *n += 1; } for (child = node->child[0]; child != nil; child = child->sibling) { if (err = phylo·countleafs(child, n), err) { errorf("leaf count: failure at '%s'", child->name); return 1; } } return 0; } // ----------------------------------------------------------------------- // tree statistics