Я пытаюсь создать метод «headSet
», который создает и возвращает новые TreeSet
, set
значений, которые являются всеми значениями в вызываемом TreeSet
, которые меньше, чем элемент параметра «до».
Я могу получить все правильные обходы, и я отлаживал в Net Beans, новый набор действительно содержит все значения, которые он должен иметь до того, как будет выдано исключение. Я просто не могу понять, почему, когда я звоню headSet(n.right,before,set)
.. конкретно n.right
.. он ломается. Все бы работало, если бы не сломалось.
Редактировать: когда я запускаю программу с проблемной строкой headSet(n.right,before,set)
, все 3 вызова метода headSet()
в основном рекурсивном помощнике находятся в трассировке стека. Когда я закомментирую эту строку, не возникает никаких проблем, кроме неправильного обхода дерева.
Это основной общедоступный вызываемый метод, который запускает рекурсивный помощник:
public SortedSet<E> headSet(E before){
SortedSet<E> set = new SearchTreeSet<E>();
headSet(root, before, set);
return set;
}
где корень — это первый узел в вызываемом TreeSet
.
Основной рекурсивный помощник:
private void headSet(Node n, E before, SortedSet<E> set) {
int comp = myCompare(n.data, before);
if (comp < 0){ //n.data is less than before
// add node n to the new set
if (n.data != null) { //It shouldn't be null but I just wanted to eliminate NPE sources
set.add(n.data);
}
// all nodes to the left are added automatically with a separate recursive function
headSet(n.left, set);
// test nodes to the right
//////////////The next statement forces a null pointer exception ////////
headSet(n.right, before, set);
}
// n.data is greater than or equal to 'before'
else {
// move to the left and retest
headSet(n.left, before, set);
}
}
Вторая рекурсивная функция не сравнивает, она просто добавляет все ветви узла в новый «набор» отсортированного дерева.
private void headSet(Node n, SortedSet<E> set){
if (n.data != null){ // 'if statement' is to eliminate NPE sources, it normally shouldn't be null
set.add(n.data);
}
if (n.left != null) { headSet(n.left, set); }
if (n.right != null) { headSet(n.right, set); }
}
РЕШЕНО : Спасибо, ребята! Это сделало это.. Я не могу поверить, что не видел этого.
Вот что я изменил, чтобы решить проблему:
if (n.left != null) {
headSet(n.left, set);
}
if (n.right != null) {
headSet(n.right, before, set);
}
А также
if (n.right != null) {
headSet(n.right, before, set);
}