setTreeNodes UnorderedTree::TreeComponents(TreeNodes *t,bool bCanonical=false){ //Returns the components ( subtree of next level) of a tree setTreeNodes setTreeComponents; //Insert into a set, the components TreeNodes::iterator itTreeNodes; Integer level=(*t)[0]; TreeNodes component; itTreeNodes=t->begin(); int i=0; bool blnend=false; while(i<t->size() &&itTreeNodes!=t->end()) { //The components start at level 0, the canonical form no if (*itTreeNodes!=level) component.push_back( (*itTreeNodes)-(bCanonical ? 0 :level)); ++itTreeNodes;i++; if (itTreeNodes==t->end()) blnend=true; else if((*itTreeNodes)<= level+1 ) blnend=true; if (blnend==true){ blnend=false; if(component.size()>0){ setTreeComponents.insert(bCanonical ? CanonicalForm(component): component ); component.clear(); } } } return setTreeComponents; }
TreeNodes UnorderedTree::CanonicalForm(TreeNodes t){ //Returns recursively the CanonicalForm of a tree if (t.size()<2) return t; setTreeNodes setTreeComponents = TreeComponents(&t,true); Integer level=t[0]; TreeNodes tn; tn.push_back(level); setTreeNodes::reverse_iterator itset; TreeNodes::iterator iteTreeNodes; for (itset=setTreeComponents.rbegin();itset!=setTreeComponents.rend();++itset){ TreeNodes t1=(*itset); for (iteTreeNodes=t1.begin();iteTreeNodes!=t1.end();++iteTreeNodes){ tn.push_back((*iteTreeNodes)); } } return tn; }