void TreeBuilder::AddRandomChildren( Node& node, bool bUseTerminal, bool bUseNode, unsigned int nDepth, unsigned int nMaxDepth ) { assert( bUseTerminal || bUseNode ); // use one or both assert( nDepth <= nMaxDepth ); NodeType::E nt( node.ChildType() ); switch ( node.NodeCount() ) { case 0: // nothing, this is terminal node assert( node.IsTerminal() ); break; case 1: node.AddCenter( CreateChild( nt, bUseTerminal, bUseNode, nDepth, nMaxDepth ) ); if ( !node.ChildCenter().IsTerminal() ) { AddRandomChildren( node.ChildCenter(), bUseTerminal, bUseNode, nDepth + 1, nMaxDepth ); } break; case 2: node.AddLeft( CreateChild( nt, bUseTerminal, bUseNode, nDepth, nMaxDepth ) ); if ( !node.ChildLeft().IsTerminal() ) { AddRandomChildren( node.ChildLeft(), bUseTerminal, bUseNode, nDepth + 1, nMaxDepth ); } node.AddRight( CreateChild( nt, bUseTerminal, bUseNode, nDepth, nMaxDepth ) ); if ( !node.ChildRight().IsTerminal() ) { AddRandomChildren( node.ChildRight(), bUseTerminal, bUseNode, nDepth + 1, nMaxDepth ); } break; } }