2014-04-11 5 views
1

이진 검색 트리에서 요소를 가져 와서 파일에 쓰는 방법에 대한 정보를 많이 찾은 다음 트리로 다시 읽습니다. 유형 "로드"기능. 나는 사람들이 그것에 대해 이야기 할 수있는 몇 가지 방법을 찾았지만 여기에있는 제안과 같은 제안을 프로그램 자체에 구현하는 데 문제가 있습니다. 그래서 여러 가지 정렬 방법 인 inOrder, postOrder 및 preOrder가 있지만 이러한 메소드 중 하나가 호출 될 때마다 항상 파일에 쓸 필요는 없습니다. saveFile 및 loadFile 메서드를 호출하여 자동으로 쓰기/읽기를하고 싶습니다. 그러나 BST의 모든 노드를 가져 오기 위해 해당 정렬 메서드에서 작성기/판독기를 호출해야합니까? 아니면 외부에서 수행 할 수있는 방법을 사용할 수 있습니까? 프로그램이 자체적으로 그렇게하기 때문에 파일에 반드시 정렬 할 필요는 없습니다. 이것에 대해 어떤 제안이 있습니까?이진 검색 트리의 내용을 저장 /로드하십시오.

public void inOrderTraverseTree (Node focusNode) { 
    if (focusNode != null){ 
     inOrderTraverseTree(focusNode.leftChild); 

     System.out.println(focusNode); 

     inOrderTraverseTree(focusNode.rightChild); 
    }//end if 
}//end inOrderTraverseTree 

그리고이 호출 할 때의 예를 다음과 같습니다

가 정렬되는 방법을 선택하는 사용자에게 옵션을 제공하는 별도의 메뉴 클래스에서 호출 내 정렬 클래스 중 하나 (의 예입니다 (메뉴 클래스에서, 스위치에) :

case 1: 
    tree.inOrderTraverseTree(tree.root); 
    menu(); 
    break; 

나 제안 사항을 알려 주시기 바랍니다 감사합니다

+0

인서트가 올바르게 작동하고 나무 균형이 잡히면 모든 주문이 작동하지만, 불균형 한 경우 선주문 순회가 현재 구조를 유지 관리합니다. –

답변

1

System.out.println 표준 출력에 기록 플래그와 같은 탐색 기능을 사용할 수 있습니다, 파일을하지. 코드를 통해 (또는하지 말았어야하는) 코드를 통해 출력을 파일로 리다이렉트하는 것이 가능합니다. (리눅스에서는 |, Windows에서는 >으로 생각하면됩니다.) 몇 가지 단점이 있습니다.

println 메소드를 원한다면 OutputStream을 함수 (예 : PrintStream)로 전달하는 것이 좋습니다. 파일로 인쇄하려면

public void inOrderTraverseTree (Node focusNode, PrintStream printStream) { 
    if (focusNode != null){ 
     inOrderTraverseTree(focusNode.leftChild, printStream); 
     printStream.println(focusNode); 
     inOrderTraverseTree(focusNode.rightChild, printStream); 
    }//end if 
}//end inOrderTraverseTree 

, 당신은 사용할 수 있습니다

inOrderTraverseTree(root, new PrintStream("fileName")); 

주를 new 호출이 파일을 삭제 것을 시작하기 전에, 당신은 아마에서 PrintStream을 저장할 것 때문에 임시 변수를 사용하여 동일한 개체를 모든 함수 호출에 전달해야합니다. 그렇지 않으면 OutputStream을 대신 사용하는 생성자를 시도 할 수 있습니다.


또 다른 옵션은 (유사 printStream 위였다 방식) 함수에 전달한 LinkedList 또는 유사한 구조의 모든 노드를 저장하는 것, 그리고 당신은 단순히 나중에 그 반복 쓸 수 파일 할 노드.당신은 코드에 몇 가지 변경으로 주위를 전달하는 대신 LinkedList를 반환 할 수

LinkedList<Node> output = new LinkedList<Node>(); 
inOrderTraverseTree(root, output); 
// iterate through 'output' and write it to file 

:와

public void inOrderTraverseTree (Node focusNode, LinkedList<Node> output) { 
    if (focusNode != null){ 
     inOrderTraverseTree(focusNode.leftChild, output); 
     output.add(focusNode); 
     inOrderTraverseTree(focusNode.rightChild, output); 
    }//end if 
}//end inOrderTraverseTree 

전화.

이 코드는 좀 더 복잡하지만 코드를 모듈화 할 수 있습니다. LinkedList을 통과하는 함수가 파일 I/O와 관련되지 않으면 더 좋을 것입니다. 반면에 코드 다시 쓰는 일은 아마도 코드 크기와 수명과 관련하여 규모에 관한 문제가 아니기 때문에 걱정하지 않아도됩니다. (규모가 큰 프로젝트에서도 소규모 프로젝트에서 수행하는 작업을 끝내는 경향이 있지만 크기는 더 작습니다. 프로젝트가 빠르게 커질 수 있음).

+0

sysout()은 현재 목록을 표시하기 위해, BufferedWriter 또는 일부 유형의'outputStream'을 사용하도록 변환하려고합니다. 그래서 파일을 traversal 메서드 안에 써야합니까, 아니면 그 메서드를 호출하고 그런 식으로 쓰는 별도의 메서드를 가질 수 있습니까? 내가 같은 정렬 방식을 몇 번이고 다시 써야 할 정렬 방법 안에서 호출하는 것처럼 느껴지나요? – user3524177

+0

필자는 제 대답에서 두 가지 옵션을 언급했습니다 - 함수 내에서 쓰는 첫 번째 함수는'System.out.println'과 비슷하지만'System.out' 대신에 다른 것을 사용합니다. 같은 선을 반복해서 인쇄하지 않는 이유를 쉽게 알 수 있습니다. 다른 옵션은 콜렉션의 모든 요소를 ​​나중에 인쇄 할 수 있도록 저장하는 것입니다 (코드를 추가해야합니다).하지만이 옵션을 사용하려는 이유는 모르겠습니다. 다른 목적. – Dukeling

+0

네, 무슨 말하는지 알 겠어. 그것은 꽤 많은 답변입니다. 감사! – user3524177

0

를 내가 제대로 이해한다면, 당신은 나무 t을 저장해야합니다! o 파일을 만들고 나중에 해당 트리를로드하십시오. 이런 식으로 접근 할 수 있습니다.

  • 파일에서 읽고 유일하게 두 순회를 사용하여 같은 트리를 재구성, 나무를 저장 전순/postorder과 함께 중위 순회를 생성하고
  • 가로드하려면 파일에 저장합니다. (Example)

당신은

public void inOrderTraverseTree (Node focusNode, boolean toSave) { 
    if (focusNode != null){ 
     inOrderTraverseTree(focusNode.leftChild);    
     if(toSave) 
      //write to file 
     else 
     System.out.println(focusNode); 

     inOrderTraverseTree(focusNode.rightChild); 
    }//end if 
}//end inOrderTraverseTree 
+0

네, 근본적으로 제가하고 싶은 것입니다 .. 그래서 traversal 메소드에서 파일 작성자를 열어야합니까? traverse 메서드를 호출하고 파일에 쓰는 별도의 메서드를 가질 방법이 없습니다. – user3524177

+0

당신은 traversal 메소드에서 파일에 직접 쓸 수도 있고, traversal 메소드가 노드의'List'를 리턴하도록 할 수도 있습니다. traversal 메소드 외부에서 파일에 쓸 수 있습니다. – GoldRoger

관련 문제