2016-08-11 10 views
2

私は、予約オーダートラバーサルメソッドを作成しようとしています。私は複数の子ノードを持つ自分のノードを使用しています。それらを追跡するために、各ノードには一連の子があります。再帰的にノードのマップをトラバースしようとすると、null値が継続できるようにチェックするのではなく、プログラムを強制終了するIndexOutOfBoundsExceptionが発生します。私はtryブロックでそれをキャッチするために最善を尽くしましたが、私はそれをまとめています。メソッドは各子配列の最初の子をたどるだけです。IndexOutOfBoundsExceptionを使用した再帰

private void traverse (Node root) { 
    peggyPoints.add(root); 
    int i = 0; 
    if (root.nexts != null) { 
     try { 
      Node current = root.nexts.get(i); 
      while (current != null) { 
       traverse(current); 
       current = current.nexts.get(i+1); 
      } 
     } catch (IndexOutOfBoundsException e) { } 
    } 
} 

peggyPointsが訪問したノードを追跡するために使用されるのArrayListです:

は、ここに私のコードです。 nextsは、指定されたノードの子の配列です。訪問したノードは1、2、4、5、3、6、私はそれが唯一の1を訪問持っているものと、2、4

おかげでなければなりません

 1 
    /\ 
    2 3 
/\ \ 
    4 5 6 

のマップを考える

あらかじめ!

答えて

3

あなたが取るべきアプローチは、現在のノードにペグを追加してから、を左右に再帰的に両方ともにトラバースすることです。論理的に間違っているとして際立っているコードの行です:

current = current.nexts.get(i+1); 

私はあなたがトラバーサルのための次のノードを取得するために再びrootを使用するべきだと思い、すなわち

current = root.nexts.get(i+1); 

しかしいうよりも、これをやって、あなたは自分のnextsリストをループ内で使用し、完全にループインデックスの管理に離れて行うことができます:編集用

private void traverse (Node root) { 
    peggyPoints.add(root); 

    if (root.nexts != null) { 
     for (Node current : root.nexts) { 
      traverse(current); 
     } 
    } 
} 
+0

@Jason感謝を。実際、境界外のインデックスのtry catchの存在は、悪いデザインのIMOの兆候です。 –

+0

完璧に動作します、ありがとう! –

関連する問題