2017-12-21 17 views
0

Inorderトラバーサルの結果をLinkedListに格納し、イテレータで取得しようとしましたが、結果を出力中にnullポインタ例外が発生しました。再帰でそれを行い、関数の値を出力しようとすると正しい出力が得られます。再帰的にinorderItr(root.left)に電話をかけようとすると、rootがnullになります。私は、私のreturn文は正しいとは思わない、確かに、以下は私のコードと私のコードが壊れているコメントです。どんなヘルプやコンセプトも高く評価されています。 Iteratorを返そうとしているので、私はthisを見ましたが、助けになりません。再び、私はJavaと新しい概念をIteratorコンセプトです。 TIA。バイナリツリーでInorderトラバーサルのIteratorを返す方法は?

編集:私は解決策を見つけた、私はINORDERトラバーサルとグローバルLinkedListのためのヘルパーメソッドを作成し、別の再帰的ヘルパーで、そのリストにすべての私の順序どおり要素を追加した

class TreeNode { 

      int data; 
      TreeNode left; 
      TreeNode right; 

      public TreeNode(int d) { 
       data = d; 
      } 

     } 

     public class TreeTraversal { 
      TreeNode root; 

      public TreeTraversal() { 
       root = null; 
      } 

     static List<TreeNode> l = new LinkedList<TreeNode>(); 
      public static Iterator<TreeNode> inorderItr(TreeNode root) { 

       List<TreeNode> l = new LinkedList<TreeNode>(); 

     //I think I am missing something here 
       if (root == null) 
        return 

     //This is where my root is null 
       inorderItr(root.left); 
       l.add(root); 
       inorderItr(root.right); 

       Iterator<TreeNode> itr = l.iterator(); 

       return itr; 

      } 

    //This code works fine 
      public static void inorderWorksFine(TreeNode root) { 

       if (root == null) 
        return; 

       inorder(root.left); 
       System.out.print(root.data + " "); 
       inorder(root.right); 
      } 



      public static void main(String args[]) { 

       TreeTraversal t = new TreeTraversal(); 
       t.root = new TreeNode(10); 
       t.root.left = new TreeNode(5); 
       t.root.left.left = new TreeNode(1); 
       t.root.left.right = new TreeNode(7); 
       t.root.right = new TreeNode(40); 
       t.root.right.right = new TreeNode(50); 

       // inorderWorksFine(t.root); 
       Iterator<TreeNode> itr = inorderItr(t.root); 

       while (itr.hasNext()) { 
        System.out.println(itr.next().data + " "); 
       } 

      } 

     } 
+2

可能な複製(https://stackoverflow.com/questions/12850889/in-order-iterator-for-binary-tree) – vinS

+0

@vinS:私は 'Iterator'を返そうとしています。私はその解決策を見てきました。上記のコードを変更して、何が間違っているのか教えてもらえますか? – Techiee

+0

このようなイテレータインターフェイスを実装するクラスを作成することをお勧めします。あなたは新しい反復ステップを作成するために各再帰的ステップでイテレータを反復することによって恐ろしいパフォーマンスに頼ることなく、データ反復子を返す再帰的メソッドを作成するのは本当に苦労します。また、イテレータを作成するために別の構造体(LinkedList)に変換すると、初期費用が高価な場合はツリーを作成する目的が幾分かぎります。 – Zachary

答えて

1

以下の回答を参照してください。方法。そのように私たちはイテレータを返すことができます

static List<TreeNode> l = new LinkedList<TreeNode>(); 

    public static Iterator<TreeNode> inorderItr(TreeNode root) { 
    recursionInorder(root); 
    Iterator<TreeNode> itr = l.iterator(); 

    return itr; 

    } 

    public static void recursionInorder(TreeNode node){ 
     if(node==null) 
       return; 

     recursionInorder(node.left); 
     l.add(node); 
     recursionInorder(node.right); 
    } 
[バイナリツリーのインオーダーイテレータ]の
関連する問題