2017-12-07 5 views
1

노드를 추가 할 때와 콘솔에 순서대로 트리를 인쇄 할 때 완벽하게 기능하는 내 자신의 노드로 이진 검색 트리를 처음부터 만들었습니다. 그러나, 나는 한 시간 반 동안 toString 방법을 사용하게되었습니다. 내가 문자열 비교 유형의 데이터를 변환 할 때이 혼란스러워지고 있다고 생각했기 때문에 toString 이진 검색 트리 탐색 방법

나는, MakeStringtoString 방법을 변경했습니다. 메서드를 하나의 노드 또는 객체 형식으로 반환 할 수 있지만 문자열 형식의 전체 트리를 반환 할 수는 없습니다. printInOrder() 메서드가 완벽하게 작동하므로 내 MakeString() 메서드는 왜 작동하지 않습니까?

public void printInOrder(){ 

    if (left != null) left.printInOrder(); 

    System.out.println(data); 

    if (right != null) right.printInOrder(); 
} 

public String MakeString(){ 

    String OrderedTree; 
    StringBuilder sb = new StringBuilder(); 
    if (data == null) return "Tree is empty"; 

    if (left != null) left.MakeString(); 

    sb.append(data); 

    if (right != null) right.MakeString(); 
+0

전체 클래스를 붙여주세요. 또한, 당신은'left.MakeString()'의 결과를 사용하지 않습니다. –

+0

또한 정말로 원하는 텍스트 출력을 보여주십시오. 콘솔에 이진 트리를 출력하는 것은 코드와 상관없이 읽을 수있는 방법입니다. –

+0

마지막 행이 누락되었지만 sb.toString() 만 반환됩니다. – Matt

답변

1

재귀를 통해 보존해야 할 것이 있으면 매개 변수로 전달해야합니다. 초기 호출을 준비하지 않거나 재귀 전후에 수행 할 작업이 없도록하려는 경우 한 쌍의 메소드가 종종 생깁니다.

경우에 따라 StringBuilder을 사용하여 재귀 전에 만들어야하며 이후에 사용됩니다.

예 :

public String MakeString() { 
    if (data == null) 
     return "Tree is empty"; 

    StringBuilder sb = new StringBuilder(); 

    MakeString(sb); 

    return sb.toString(); 
} 

private void MakeString(StringBuilder sb) { 
    if (left != null) 
     left.MakeString(sb); 

    sb.append(data); 

    if (right != null) 
     right.MakeString(sb); 
} 
+0

정말 부드럽게 작동합니다! 마음의 상태에서 나는 오늘 아침에, 나는 그것이 파일에 인쇄하고 파일에서 그것을 읽는 것을 가지고 있었다. 두 가지 방법! 완벽 해, 고마워! – Matt