0

新しいをheadSet作成して返すメソッド ' ' を作成しようとしていますが、これらの値はすべて呼び出し元の値であり、パラメータ要素 'before' よりも小さい値です。 TreeSetsetTreeSet

すべての正しいトラバーサルを取得でき、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);
}
4

1 に答える 1