}
}
-ComponentTree::ComponentTree(const std::vector<Component>& components) : _root(0,Component()){
+/**
+ * Implemented as O(n*log n), should be possible in O(n), but this is pretty clean, and should
+ * be fast enough
+ */
+ComponentTree::ComponentTree(const std::vector<Component>& components) : _root(new Node(0,Component())){
map<size_t,Component> starting;
map<size_t,Component> ending;
size_t max = 0;
max = (c->i2 > max ? c->i2 : max);
}
- Node* q = &_root;
+ Node* q = _root;
Node* p = new Node(q,starting[0]);
for (size_t i = 1; i < max; ++i){
}
ComponentTree::~ComponentTree(){
+ delete _root;
}
void ComponentTree::makeUnoriented(){
- removeOriented(&_root);
+ removeOriented(_root);
+ while (_root->_children.size() == 1 && _root->_comp.sign == 0){
+ Node* n = _root->_children[0];
+ _root->_children.clear();
+ delete _root;
+ _root = n;
+ }
}
void ComponentTree::removeOriented(Node* n){
- for (vector<ComponentTree::Node*>::iterator c = n->_children.begin();
+ for (vector<Node*>::iterator c = n->_children.begin();
c != n->_children.end(); /*empty*/){
removeOriented(*c);
- if ((*c)->_children.size() == 0 && ((*c)->_comp.i2 == 0 || (*c)->_comp.sign == 0)){
+ if ((*c)->_children.empty() && (*c)->_comp.sign == 0){
delete *c;
n->_children.erase(c);
}else{
}
}
}
+
+size_t ComponentTree::countLeaves(){
+ size_t leaves = countLeaves(_root);
+ if (_root->_children.size() < 2 && _root->_comp.sign != 0){
+ ++leaves;
+ }
+ return leaves;
+}
+
+size_t ComponentTree::countLeaves(Node* n){
+ if (n != _root && n->_children.empty()){
+ return 1;
+ }
+ size_t leaves = 0;
+ for (vector<Node*>::iterator c = n->_children.begin();
+ c != n->_children.end(); ++c){
+ leaves += countLeaves(*c);
+ }
+ return leaves;
+}
CPPUNIT_TEST_SUITE( TESTNAME );
CPPUNIT_TEST( testCreate );
CPPUNIT_TEST( testMakeUnoriented );
+ CPPUNIT_TEST( testCountLeaves );
CPPUNIT_TEST_SUITE_END();
protected:
void testCreate (){
GeneOrder go(_validPerm.begin(),_validPerm.end());
ComponentTree t(findComponents(go));
- ComponentTree::Node* n = &t._root;
+ ComponentTree::Node* n = t._root;
CPPUNIT_ASSERT_EQUAL((size_t)4u,count(n));
CPPUNIT_ASSERT_EQUAL((size_t)5u,count(n,true));
GeneOrder go2(_validPerm4.begin(),_validPerm4.end());
ComponentTree t2(findComponents(go2));
- n = &t2._root;
+ n = t2._root;
CPPUNIT_ASSERT_EQUAL((size_t)6u,count(n));
CPPUNIT_ASSERT_EQUAL((size_t)9u,count(n,true));
GeneOrder go(_validPerm.begin(),_validPerm.end());
ComponentTree t(findComponents(go));
t.makeUnoriented();
- ComponentTree::Node* n = &t._root;
+ ComponentTree::Node* n = t._root;
CPPUNIT_ASSERT_EQUAL((size_t)0u,count(n));
CPPUNIT_ASSERT_EQUAL((size_t)1u,count(n,true));
GeneOrder go2(_validPerm4.begin(),_validPerm4.end());
ComponentTree t2(findComponents(go2));
t2.makeUnoriented();
- n = &t2._root;
+ n = t2._root;
CPPUNIT_ASSERT_EQUAL((size_t)4u,count(n));
CPPUNIT_ASSERT_EQUAL((size_t)6u,count(n,true));
CPPUNIT_ASSERT(n->_children[1]->_children[0]->_children[1]->_comp == go24);
}
+ void testCountLeaves (){
+ GeneOrder go(_validPerm.begin(),_validPerm.end());
+ ComponentTree t(findComponents(go));
+ t.makeUnoriented();
+
+ //CPPUNIT_ASSERT_EQUAL((size_t)0u,t.countLeaves());
+
+ GeneOrder go2(_validPerm4.begin(),_validPerm4.end());
+ ComponentTree t2(findComponents(go2));
+ t2.makeUnoriented();
+ ComponentTree::Node* n = t2._root;
+ CPPUNIT_ASSERT_EQUAL((size_t)2u,n->_children.size());
+ CPPUNIT_ASSERT_EQUAL(false,n->_children.empty());
+ CPPUNIT_ASSERT_EQUAL((size_t)3u,t2.countLeaves());
+ }
+
};
CPPUNIT_TEST_SUITE_REGISTRATION( TESTNAME );