新しいをheadSet
作成して返すメソッド ' ' を作成しようとしていますが、これらの値はすべて呼び出し元の値であり、パラメータ要素 'before' よりも小さい値です。 TreeSet
set
TreeSet
すべての正しいトラバーサルを取得でき、Net Beans でデバッグしたところ、新しいセットには、例外がスローされる前に必要なすべての値が含まれています。私が電話したときになぜheadSet(n.right,before,set)
..具体的n.right
には..それが壊れたのか理解できません。壊れなければ問題なく使えました。
編集:問題行 , でプログラムを実行すると、メインの再帰ヘルパーのheadSet(n.right,before,set)
3 つのメソッド呼び出しがすべてスタック トレースに記録されます。headSet()
その行をコメントアウトすると、不適切なツリー トラバーサル以外の問題はありません。
これは、再帰ヘルパーをトリガーする主要な public と呼ばれるメソッドです。
public SortedSet<E> headSet(E before){
SortedSet<E> set = new SearchTreeSet<E>();
headSet(root, before, set);
return set;
}
root は、呼び出された の最初のノード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);
}
}
2 番目の再帰関数は比較しません。すべてのノード ブランチを新しいソート ツリー セット '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);
}