2016-06-04 5 views
0

내 코드를 수정하는 데 도움을주십시오. toString 방법이진 검색 트리의 toString 메서드

이 문자열은 괄호 {}의 빈 집합을 반환해야

{currentData, leftSubtree, rightSubtree} 

빈 트리로 포맷해야합니다. 내가지고있어 JUnit 테스트에 대한

:

Expected: {5, {0, {-5, {}, {}}, {3, {}, {}}}, {10, {7, {}, {}}, {13, {}, {}}}} 
Actual: {5, {0, {-5, {}, {3, {}, {}, {10, {7, {}, {13, {}, {}, {}} 

이 내 코드입니다 :

public String toString() { 
    StringBuffer string = new StringBuffer("{"); 
    toString(root, string); 
    string.append("}"); 
    return string.toString(); 
} 

private void toString(BSTNode<T> node, StringBuffer string) { 

    if (node != null) { 
     string.append(node.getData()); 
     if (node.getLeft() != null) { 
      string.append(", " + "{"); 
      toString(node.getLeft(), string); 
     } 
     if (node.getRight() != null) { 
      string.append(", " + "{"); 
      toString(node.getRight(), string); 
     } 
    } 
    string.append(", {}"); 
} 

감사합니다!

+2

IDE 디버거의 코드를 추적 한 적이 있습니까? 너 뭐가 보이니? –

+1

당신은 재발행 후 끝 중괄호를 쓰지 않습니다. –

+0

'StringBuffer'가 아닌'StringBuilder'를 사용하십시오. – Andreas

답변

3

코드는 자신을 재귀 적으로 호출하기 전에 {을 추가하지만 반환시에는 }을 추가하지 않습니다. 이것은 재귀 호출 모두에 적용됩니다.

또한 비어 있지 않은 트리의 경우에도 무조건 코드에 , {}이 추가됩니다.


대신, 재귀 방법이해야 할 쓰기는 말했다 정확히 : {}

이에게 발신자를 확인하지 않는

  • 형식
  • {currentData, leftSubtree, rightSubtree} 같은 형식 빈 트리 작업을 수행하면 논리 값과 중복되므로 {} 값을 추가 할 수 있습니다 (DRY : Do not Repeat Yourse lf).

    기대되는 결과는 리프 노드가 으로 표시되어야하며 {value}이 아니라는 것을 보여줍니다. 이는 코드가 추가 if 문과 함께 수행하는 것입니다.

    또한 StringBuffer을 사용하지 말고 StringBuilder을 사용하고 재귀 적 방법은 static이 될 수 있습니다.

    @Override 
    public String toString() { 
        StringBuilder string = new StringBuilder(); 
        toString(this.root, string); 
        return string.toString(); 
    } 
    private static <T> void toString(BSTNode<T> node, StringBuilder string) { 
        string.append('{'); 
        if (node != null) { 
         string.append(node.getData()); 
         string.append(", "); 
         toString(node.getLeft(), string); 
         string.append(", "); 
         toString(node.getRight(), string); 
        } 
        string.append('}'); 
    } 
    

    당신은 재귀 방법은 StringBuilder를 반환 할 경우 코드를 응축 좋아하는 경우에, 당신의 코드가 작아 질 수 있습니다. 기능적으로나 성능면에서 차이가 없습니다. 매개 변수를 뒤집어 쓰면 더 읽기 쉽습니다.

    @Override 
    public String toString() { 
        return toString(new StringBuilder(), this.root).toString(); 
    } 
    private static <T> StringBuilder toString(StringBuilder string, BSTNode<T> node) { 
        string.append('{'); 
        if (node != null) { 
         string.append(node.getData()); 
         toString(string.append(", "), node.getLeft()); 
         toString(string.append(", "), node.getRight()); 
        } 
        return string.append('}'); 
    } 
    
+0

정말 고마워요 !!!!!! 그것은 많은 도움이 !! – sd2205

+0

원 : 마지막 조각 +1 – Andrew

관련 문제