int sumOfLeftLeaves(TreeNode* root) { if (root == NULL || isLeave(root)) { return 0; } int sum = sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right); if (isLeave(root->left)) { sum += root->left->val; } return sum; }
unsigned nbInternalNode(Tree tree) { if (isEmpty(tree)) return 0; else if(isLeave(tree)) return 0; else return 1 + nbInternalNode(left(tree)) + nbInternalNode(right(tree)); }
unsigned nbLeaves(Tree tree) { if(isEmpty(tree)) return 0; else if (isLeave(tree) ) return 1; else return nbLeaves(left(tree)) + nbLeaves(right(tree)); }
R PPForest<L>::maxScore(const Algebra<R,L> &alg, size_type i, size_type j) const { R down, over; if(j==0) return 0; if(isLeave(i)) { over=maxScore(alg,rb(i),j-1); return alg.replace(label(i),0,label(i),over); } else { down=maxScore(alg,i+1,noc(i)); over=maxScore(alg,rb(i),j-1); return alg.replace(label(i),down,label(i),over); } }
R PPForest<L>::maxScore(const RNA_Algebra<R,L> &alg, Uint i, Uint j) const { R down, over; if(j==0) return 0; if(isLeave(i)) { over=maxScore(alg,rb(i),j-1); return alg.replace(label(i),0,label(i),over); } else { down=maxScore(alg,i+1+1,noc(i)-2); over=maxScore(alg,rb(i),j-1); return alg.replacepair(label(i+1),label(i+1),down,label(getRightmostBrotherIndex(i+1)),label(getRightmostBrotherIndex(i+1)),over); } }
void RNAProfileAlignment::makePairTable(map<Uint,Uint> &pairs, Uint row) const { pair<int,int> *baseIndex; // left and right base RNA_Alphabet c; assert(row<m_numStructures); baseIndex=new pair<int,int>[m_size]; // initialize pairs, all gaps for(int i=size()-1;i>=0;i--) { baseIndex[i].first=-1; baseIndex[i].second=-1; } for(int i=size()-1;i>=0;i--) { c=m_lb[i].columnStr[row]; if(isLeave(i)) { if(c!=ALPHA_GAP) { baseIndex[i].first=i; baseIndex[i].second=i; } } else { // internal node // leftmost and rightmost base bool lmBaseFound=false; for(size_type r=0,h=i+1;r<getMaxLength(i+1);r++,h=rb(h)) { // leftmost base if(!lmBaseFound && baseIndex[h].first != -1) { baseIndex[i].first=baseIndex[h].first; lmBaseFound=true; } // rightmost base if(baseIndex[h].second != -1) { baseIndex[i].second=baseIndex[h].second; } } // report pairing bases if P node if(c==ALPHA_BASEPAIR) { assert(baseIndex[i].first != -1); assert(baseIndex[i].second != -1); assert(baseIndex[i].first < baseIndex[i].second); pairs[baseIndex[i].first]=baseIndex[i].second; pairs[baseIndex[i].second]=baseIndex[i].first; } } } delete[] baseIndex; }
int isInternalNode(Tree tree) { return !isLeave(tree); }