Buggy code:
@ objid ( "61261918-d6ad-4d4d-a19f-e6c7088f5dd6" ) public class DecisionTree { private int dataN ; private int trainN ; private int testN ; private int attrN ; private int attrSampleN ; private int treeId ; private int maxDepth ; private TreeNode rootNode ; private List < DataVector > train ; private List < DataVector > test ; private List < Integer > attrSample ; private double logOfTwo = Math . log ( 2 ) ; @ objid ( "95f01270-0b39-4c6b-bbf3-fb177f21545e" ) public DecisionTree ( final List < DataVector > data , final double bootstrapRate , final int attrSampleN , final int maxDepth , final int treeId ) { } public TreeNode getRootNode ( ) { } public int getDataN ( ) { } public int getTrainN ( ) { } public int getTestN ( ) { } public int getAttrN ( ) { } public int getAttrSampleN ( ) { } public int getTreeId ( ) { } @ objid ( "76d43c96-c471-4b7d-a417-d0a16d9c295c" ) public String saveToString ( ) { } @ objid ( "359fef83-1f91-4226-b4e6-33118900cb50" ) public void loadFromString ( final String tree ) { } @ objid ( "11f42db2-137b-4fd3-8d5c-065ee3ecdf65" ) public void createTree ( ) { } @ objid ( "943639d0-f911-4e72-b5b3-3087f8f11863" ) public int classify ( final DataVector testData ) { } @ objid ( "bd35c418-14d7-4599-891b-34837487a39c" ) private void bootstrapSample ( final List < DataVector > data ) { } @ objid ( "22963c8e-9140-49f2-beb7-3b2458a06c51" ) private void bootstrapAttr ( ) { } @ objid ( "008d3f40-e60d-4c6e-9eb2-7018b83bf180" ) <START_BUG> private void recursiveSplit ( final TreeNode parent , List < Integer > attr ) { <END_BUG> int curClass = parent . checkIfSameClass ( ) ; if ( ( - 1 ) == curClass ) { if ( ( ( - 1 ) != ( maxDepth ) ) && ( ( parent . getLevel ( ) ) >= ( maxDepth ) ) ) { parent . setClassVal ( parent . voteMajorClass ( ) ) ; return ; } DecisionTree . SplitAttrObj attrObj = new DecisionTree . SplitAttrObj ( ) ; assert 0 < ( attr . size ( ) ) ; assert ( attrSampleN ) == ( attr . size ( ) ) ; findSplitPosition ( parent . getData ( ) , attr , attrObj ) ; System . out . println ( ( ( ( "Min<seq2seq4repair_space>Attr:<seq2seq4repair_space>" + ( attrObj . attr ) ) + "<seq2seq4repair_space>Min<seq2seq4repair_space>Val:<seq2seq4repair_space>" ) + ( attrObj . val ) ) ) ; parent . setSplitAttr ( attrObj . attr ) ; parent . setSplitVal ( attrObj . val ) ; List < DataVector > [ ] childData ; childData = splitData ( parent . getData ( ) , attrObj . attr , attrObj . val ) ; if ( 0 != ( childData [ 0 ] . size ( ) ) ) { parent . setLeftChild ( new TreeNode ( childData [ 0 ] ) ) ; recursiveSplit ( parent . getLeftChild ( ) , attr ) ; } if ( 0 != ( childData [ 1 ] . size ( ) ) ) { parent . setRightChild ( new TreeNode ( childData [ 1 ] ) ) ; recursiveSplit ( parent . getRightChild ( ) , attr ) ; } } else { parent . setClassVal ( curClass ) ; return ; } } private void findSplitPosition ( List < DataVector > data , List < Integer > attr , DecisionTree . SplitAttrObj attrObj ) { } private double checkPosition ( List < DataVector > data , int attr , double val ) { } private List < DataVector > [ ] splitData ( List < DataVector > data , int minAt , double minAtVal ) { } private List < Double > getClassProbs ( List < DataVector > data ) { } private double calcEntropy ( List < Double > ps ) { } private class SplitAttrObj { public int attr ; public double val ; SplitAttrObj ( ) { } } }

Fix:
private void recursiveSplit ( TreeNode parent , List < Integer > attr ) {