2016-05-09 4 views
2

私の心には同じことをするが、それはないという2つのコードがあります。 私のカスタムセットツリーのイテレータを作成しようとしています。ここにコードがあります。自分のツリーを持つJava再帰イテレータ

public LinkedList<AnyType> traverse (TheNode<AnyType> node,LinkedList<AnyType> theList){ 
    if (node.left != null) 
     return traverse (node.left,theList);   
    theList.push(node.element); 
    if (node.right != null) 
     return traverse (node.right,theList);  

    return theList; 

} 

public void traverseNrTwo (TheNode<AnyType> node){ 
    if (node.left != null){ 
     traverseNrTwo (node.left); 
    } 
    list.push(node.element); 
    if (node.right != null){ 
     traverseNrTwo (node.right); 
    } 
} 

traverseのみ木の左側を通過し、リストに追加されますが、traveseNrTwoは、ツリー全体を通過します。だから私の質問は、なぜ彼らは2つの異なることをするのだろうか?

答えて

4

再帰呼び出しがツリーの左側だけを参照するため、再帰呼び出しの結果は返さないでください。

public LinkedList<AnyType> traverse (TheNode<AnyType> node,LinkedList<AnyType> theList){ 
    if (node.left != null) 
     traverse (node.left,theList); // if you return traverse(node.left,theList) here, 
             // you end the recursion without adding the current 
             // node and visiting the right sub-tree 
    theList.push(node.element); 
    if (node.right != null) 
     traverse (node.right,theList);  

    return theList; 
} 

はまた、あなたがあなたのメソッドに引数としてLinkedList<AnyType>を渡しているので、(つまり、あなたのメソッド内に新しいLinkedListインスタンスを作成していない)ことに注意してください、あなたはそれを返す必要はありません。戻り値の型を単にvoidに変更することができます。

関連する問題