void getPostOrder(int *pre, int *mid, int *post, int len){ int i; int idx = 0; for(i = 0; i < len; i++) if(mid[i] == pre[0]){ idx = i; break; } if(len < 0) return; getPostOrder(pre +1,mid, post, idx); getPostOrder(pre + idx + 1, mid+ idx + 1, post + idx, len - idx -1); post[len -1] = pre[0]; }
int main(){ int i; int cnt = 0; char c; int pre[100] = {-1}; int mid[100] = {-1}; int *post; while(scanf("%c", &c), c != '\n'){ if(isdigit(c)){ pre[cnt++] = c; } } cnt = 0; while(scanf("%c", &c), c != '\n'){ if(isdigit(c)){ mid[cnt++] = c; } } post = malloc(sizeof(int) * cnt); assert(post != NULL); getPostOrder(pre, mid, post, cnt); for(i = 0; i< cnt; i++){ printf("%d\n", post[i]); } printf("\n"); }
void parsimony(Tree *tree, int nseqs, char **seqs, bool buildAncestral, char **ancetralSeqs) { int seqlen = strlen(seqs[0]); // allocate dynamic table ParsimonyCell *table = new ParsimonyCell [tree->nnodes * 4]; int *gapless = new int [tree->nnodes]; // initalize distances for (int i=0; i<tree->nnodes; i++) { tree->nodes[i]->dist = 0.0; gapless[i] = 0; } // get recursion order ExtendArray<int> postorder(0, tree->nnodes); getPostOrder(tree, &postorder); for (int i=0; i<seqlen; i++) { // initialize leaves // iterate just over the leaves for (int j=0; j<nseqs; j++) { int base = dna2int[(int) (unsigned char) seqs[j][i]]; if (base == -1) { // gap for (int k=0; k<4; k++) { table[matind(4, j, k)].cost = 0; table[matind(4, j, k)].gap = true; } } else { for (int k=0; k<4; k++) { table[matind(4, j, k)].cost = MAX_COST; table[matind(4, j, k)].gap = false; } table[matind(4, j, base)].cost = 0; } } // populate cost table parsimony_helper(tree, nseqs, seqs, table, postorder); // find min cost at root float mincost = MAX_COST; int minbase= 0; int root = tree->root->name; for (int a=0; a<4; a++) { if (table[matind(4, root, a)].cost < mincost) { mincost = table[matind(4, root, a)].cost; minbase = a; } } // add up dist getParsimonyCost(tree, tree->root, minbase, table); // add up ungapped chars for (int j=0; j<tree->nnodes; j++) { gapless[j] += table[matind(4, j, 0)].gap ? 0 : 1; } } // divide subsitutions by number of sites for (int i=0; i<tree->nnodes; i++) if (gapless[i] != 0.0) tree->nodes[i]->dist /= gapless[i]; // place root in middle of top branch Node *rootnode = tree->root; float totlen = rootnode->children[0]->dist + rootnode->children[1]->dist; rootnode->children[0]->dist = totlen / 2.0; rootnode->children[1]->dist = totlen / 2.0; // cleanup delete [] table; delete [] gapless; }