private void populateTree(List<Node<TagProbability>> leaves, List<String> words){
		Node<TagProbability> parent = leaves.get(0).getParent();
		List<TagProbability> tagProbabilities;
		if(parent != null) {
			for(Node<TagProbability> leaf : leaves){
                //Approximation: Only consider the top half most likely tags to improve performance
				tagProbabilities = getTopHalfProbs(calculatePossibleTagProbabilities(words.get(0), leaf.getData().getTag(), parent.getData().getTag()));
                for(TagProbability tp : tagProbabilities){
                    leaf.add(new Node<TagProbability>(tp));
				}
			}
		}

		else{
			tagProbabilities = calculatePossibleTagProbabilities(words.get(0), null, null);
			for(TagProbability tp : tagProbabilities){
                leaves.get(0).add(new Node<TagProbability>(tp));
			}
		}

		words.remove(0);

		if(words.size() > 0){
			for(Node<TagProbability> leaf : leaves){
				ArrayList<String> wordsCopy = new ArrayList<String>();
				for(String word : words)
					wordsCopy.add(word);
                if(leaf.getChildren().size() > 0){
                    //Recurse on children
				    populateTree(leaf.getChildren(),wordsCopy);
                }
			}
		}
	}