Я немного новичок в Java и очень новичок в рекурсии и бинарных деревьях. Я создаю программу, которая берет текст из документа и сохраняет его в двоичном дереве. Затем мне нужно взять строку и узнать, сколько раз она появляется в тексте.Справка Java Recursion & Binary Trees
Мои проблемы возникают, когда я добавляю данные и/или когда я ищу данные для строки.
Я решил сохранить строку и частоту в каждом узле по мере его создания. Поэтому мои методы добавления следующие:
public void add(String newWord) {
//Change the word case to make comparing easier
newWord = newWord.toUpperCase();
root = recursiveAdd(root, newWord);
}
/**
* Takes the root and recurses until the root is null (base case)
* Frequency is incremented if the data is being added, or if
* it already exits. If the data is not present, the method recurses
*/
private Node recursiveAdd(Node subTree, String newWord) {
//Base case: the root is null
//Empty trees have a node created, set, and incr freq
if (subTree == null) {
subTree = new Node();
subTree.setStoredWord(newWord);
subTree.incrFreqCount();
return subTree;
}
int comparison = newWord.compareTo(subTree.getStoredWord());
//For a word already in tree, increment the frequency
if (comparison == 0) {
if(newWord.equalsIgnoreCase("translyvania"))
System.out.println("Entered same word incrementation");
subTree.incrFreqCount();
return subTree;
//The root comes before the new word, then
//move on to the right child
} else if(comparison < 0) {
subTree.setLchild(recursiveAdd(subTree.getLchild(), newWord));
} else { //if(comparison > 0) {
subTree.setRchild(recursiveAdd(subTree.getRchild(), newWord));
}
return subTree;
}
Я не могу сказать, где моя проблема. Для слова, которое я ищу, иногда говорится, что оно происходит 16 раз (что я должен получить), и иногда он говорит 1 раз. Кажется, что это совсем несовместимо, и изменение ценности по-видимому не имеет причины (хотя я знаю, что он должен быть один).
Как только мое дерево построено, я беру строку, которую я ищу, и передаю ее с помощью этих методов.
public void wordSearch(String lookForWord){
lookForWord = lookForWord.toUpperCase();
wordSearchRecur(root, lookForWord);
}
private boolean wordSearchRecur(Node subTree, String lookForWord){
//Base case
// The root is that same as the string
if(subTree == null){
System.out.println("The word \"" + lookForWord + "\" is not "
+ "found in the text");
return false;
}
int comparison = lookForWord.compareTo(subTree.getStoredWord());
if(comparison == 0){
System.out.println("The word \"" + lookForWord + "\" is found " +
subTree.getFreqCount() + " times in the text");
return true;
//Alphabetically before, then move to left branch
} else if (comparison < 0){
System.out.println("move to left");
return wordSearchRecur(subTree.getLchild(), lookForWord);
//Alphabetically after, then move to right branch
} else { // if(comparison > 0){
System.out.println("move to right");
return wordSearchRecur(subTree.getRchild(), lookForWord);
}
}
Я также не могу понять, почему я добираюсь до конца метода wordSearchRecur(). Разве я не должен возвращаться, прежде чем он дойдет до этого? Мой вывод показывает, что он достигает его несколько раз.
Я знаю, что мне не хватает огромных частей этих концепций, но смотреть на все предыдущие сообщения не помогает. Должно быть, я потратил 3 часа на поиск ответа на Stack, не говоря уже обо всех других сайтах.
Пожалуйста, помогите!
EDIT: Я отредактировал код, чтобы включить то, что я изменил, благодаря помощи @Joop Eggen. Теперь у меня есть частота, вычисленная правильно во время recursiveAdd(), но во время wordSearchRecur() частота не кажется следовать за узлом. Даже при сравнении == 0 частота freqCount остается равной 1.
РЕШЕНИЕ: После помощи @Joop Eggen дальнейшие проблемы были только результатом недосмотра. Спасибо за помощь.
Вы достигаете конца рекурсивного метода, потому что вы должны возвращать результаты рекурсивных вызовов. 'return wordSearchRecur (root.getLchild(), lookForWord);' и 'return wordSearchRecur (root.getRchild(), lookForWord);'. – Eran