private DecisionNode buildTree(List<DataEntry<int[], Integer>> data_set){
		DecisionNode root = new DecisionNode(-1, false);
		boolean is_uniformed = true;
		for(int i=1;i<data_set.size();i++){
			if(data_set.get(i-1).label != data_set.get(i).label){
				is_uniformed = false;
				break;
			}
		}
		if(is_uniformed){
			root.is_leaf = true;
			root.label = data_set.get(0).label;
			return root;
		}
		if(marked_counter == N){
			root.is_leaf = true;
			root.label = calcMajority(data_set);
			return root;
		}
		int best_feature = chooseBestFeature(data_set);
		marked[best_feature] = true;
		marked_counter ++;
		root.split_feature_index = best_feature;
		Set<Integer> unique_value = getUniqueValue(data_set, best_feature);
		for(Integer val:unique_value){
			root.childs.put(val, buildTree(splitData(data_set, best_feature, val)));
		}
		marked[best_feature] = false;
		marked_counter --;
		return root;
	}