2011-11-11 4 views
1

나는 임의의 2 진 검색 트리의 깊이 우선 검색을 생성하기위한 간단한 코드 스 니펫을 가지고있다.왜이 Depth-first 검색은 NullPointerException을 생성합니까?

public void printByDepth() 
{ 
    Queue<BinaryNode<T>> queue = new LinkedList<BinaryNode<T>>(); 
    BinaryNode<T> current = this; 
    queue.add(current); 
    while(!queue.isEmpty()){ 
     current = queue.remove(); 
     System.out.println(current.element); 
     if(current.left != null) 
      queue.add(current.left); 
     if(current.right != null) // had an extra semicolon here, fixed 
      queue.add(current.right); 
    } 
} 

그것은 꽤 표준 큐 접근하지만 어떤 이유로 라인 8 (println(current.element))에 대한 NPE를 생산 : 이것은 내 코드입니다. 내가 사용하는 나무는 다음 DF 출력을 생성해야합니다 : F B G A D I C E H. 나는 이것을 종이에서 정확히 해내었고, 전체 트리 (이 경우에는 적어도)를 통과하기 전에 current = null 또는 queue.isEmpty() = true를 얻지 말아야한다. 그래서 왜 이런 일이 일어나고 있는지 모르겠다. 노드 중 하나도 Null 컨텐츠가 없습니다.

또한 흥미롭게도 while 조건을 while(current != null)으로 변경하면 NPE가 표시되지 않지만 출력은 F B G A D I이며 마지막 레벨 요소가 누락되었습니다.

내가 간결한 뭔가가있을 것이라고 확신합니다 ... 힌트가 있습니까?

편집 : 런 어웨이 세미콜론 = (감사합니다, 로저

+1

가장 좋은 방법은 디버거를 사용하여 코드를 단계별로 실행하는 것입니다. –

+0

마지막'current = queue.peek();'는 중복되어야합니다. –

+0

@PeterLawrey Lawrey : 죄송합니다. 손으로 일부 디버깅을 시도하고 제거하는 것을 잊었습니다. – user991710

답변

6

문제... current.right null가 아닌 경우 , 그럼 아무것도하지 않고 그 후, 항상 current.right을 추가; : 함께이 기본적으로 의미있는 경우에()

if(current.right != null); 
     queue.add(current.right); 

당신의 세미콜론을 참조하십시오. (null 인 경우에서도) 큐에 추가합니다.

코드를 자동으로 형식화하면 current.right를 if 문에 추가하는 것이 현혹되어 버리므로 잘못 표시 될 수 있습니다.

+0

세상에 ... 무서운 ... 나는 이미 컴파일러 버그를 생각하고 있었다. 멋지다. +1 –

+0

실례합니다. 이것은 단지 이른 아침에이 재료를 사용하지 않도록 상기시켜줍니다. 예리한 눈을 보내 주셔서 감사합니다! – user991710

+0

@ user991710 ... 또는 Java 코드 규칙과 같은 중괄호를 사용하도록 권유합니다. –

0

마지막 current = queue.peek(); 중복해야 while(current != null) "수정"문제가 당신이 목록에서 null 값이 제안 사실

+0

엿보기에 대한 위의 의견을 참조하십시오. 나는 또한 철저히 검사했고 아무 노드도 null 요소를 포함하지 않았다. (존재하지 않는 자식에 대한 포인터 외에). 이 트리는 in/pre/postorder의 구현과 함께 작동하므로 대기열과 함께 작동해야합니다. – user991710

+0

문제를 재현하기 위해 간단한 자체 포함 테스트를 구성 할 수 있습니까? –

관련 문제