2017-12-21 11 views
0

Inorder 순회 결과를 LinkedList에 저장하고 반복자로 검색하려고하지만 결과를 인쇄하는 동안 널 포인터 예외가 발생합니다. 내 함수에서 재귀 및 인쇄 값을 사용하여 올바른 결과를 얻었습니다. 재귀 적으로 inorderItr(root.left)에 전화를 걸면 root이 null로 표시됩니다. 내 return 문이 정확하지 않다고 생각합니다. 아래 코드는 내 코드가 손상되어있는 부분입니다. 모든 도움과 개념은 높이 평가됩니다. 내가 Iterator을 돌려 주려고 노력하면서, 내가 this를 보았다. 그러나 doesnt 한 도움. 다시 말하지만, 나는 Java와 새로운 개념이 Iterator입니다. TIA.바이너리 트리에서 Inorder traversal에 대한 Iterator를 반환하는 방법은 무엇입니까?

편집 : 솔루션, 나는 중위 순회 글로벌 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

추천 된 iterator 인터페이스를 구현하는 클래스를 만드는 것이 좋습니다. 새로운 재귀 적 단계에서 반복자를 반복하여 무서운 성능을 사용하지 않고도 데이터 반복자를 반환하는 재귀 적 메서드를 만드는 것은 정말 힘든 일입니다. 게다가, 다른 구조 (LinkedList)로 변환하여 반복자를 작성하면 값 비싼 초기 지출 비용이있는 경우 Tree를 사용하는 목적을 다소 상실 할 수 있습니다. – 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); 
    } 
[이진 트리에서 주문 반복자]의
관련 문제