2012-05-02 8 views
0

프로그램을 종료 할 때 파일에 이진 트리를 저장하고 프로그램을 다시 실행할 때 다시 작성하려고합니다. 방법은이 같은 모습에 저장 내 :파일에서 이진 트리 만들기

public static void save(TreeNode node, BufferedWriter out) { 
    if (node == null) return; 
    out.write(node.value()); // these nodes hold Strings 
    out.newLine(); 
    save(node.left(), out); 
    save(node.right(), out); 
} 

내가 함께하는 데 문제 부분은 재건 과정을, 그래서 많이 주시면 감사하겠습니다에 대한 도움말을 표시합니다.

EDIT : 모든 노드에는 2 또는 0 개의 자식이있는 것으로 알려져 있습니다.

+1

지금까지 무엇이 있습니까? 너 무슨 문제있어? – twain249

+0

'ObjectOutPutStream'으로 직렬화하고'ObjectInputStream'을 사용하여 역 직렬화하는 방법은 무엇입니까? – esej

+0

@ A.R.S. 독서에 문제가 있다는 것을 알고 있지만 내가 알고 싶은 것은 독서의 일부, 즉 파일 설정, 행 읽기, 트리 만들기, 노드가 올바른 위치에 있지 않음 등입니다. – twain249

답변

2

정확히 동일한 분기 구조로 트리를 저장하려면 null을 표시해야합니다.

private static final String NULL_TREE_NODE = ""; 

public static void save(TreeNode node, BufferedWriter out) { 
    if (node == null) { 
     out.write(NULL_TREE_NODE); // null 
     out.newLine(); 
     return; 
    } 
    assert !node.value().equals(NULL_TREE_NODE); // Reserver for us. 
    assert !node.value().matches(".*[\r\n].*"); // Newline not allowed in value. 
    out.write(node.value()); // these nodes hold Strings 
    out.newLine(); 
    save(node.left(), out); 
    save(node.right(), out); 
} 

public static TreeNode load(BufferedReader in) throws IOException { 
    String value = in.readLine(); 
    if (value == null) 
     throw new EOFException(); // Unexpected end of input. 
    if (value.equals(NULL_TREE_NODE)) { 
     return null; 
    } 
    TreeNode node = new TreeNode(); 
    node.value(value); 
    node.left(load(in)); 
    node.right(load(in)); 
    return node; 
} 
+0

이것은 왼쪽 틱 트리를 생성합니다. 파일이 끝날 때까지 왼쪽으로 모두 이동합니다. 트리를 재구성 할 수 없습니다. – Cratylus

+0

아니요, 'k (f (a, null, null), null), p (null, null))'는 'k f a NTN NTN NTN p NTN NTN'이라고 쓰는 데이터 구조를 반복적으로 따릅니다. –

+0

'node.left (load (in)); '는 예제에서 파일이 완료 될 때까지 반복적으로 호출됩니다. – Cratylus

1

당신이하고있는 일이 잘못되었습니다.
예. 당신은 파일에 저장하는

 A 
    B C 
    D F 
E  

: 당신이 나무가있는 경우

A 
B 
D 
E 
C 
F  

이 트리 이런 식으로 재구성하는 것은 불가능합니다. 예 : 누가 자식이 D입니까? B 님 또는 A 님의 님?

알고리즘을 변경하여 예를 들어 저장해야합니다. 어떤 노드가 어느 노드를 부모로 가지는지를 알 수 있도록 레벨별로 레벨을 지정하십시오.

1

왜 직렬화를 사용하지 않습니까? 및 ObjectOutputStream, ObjectInputStream 및 단일 메서드로드 트리 전체?

class MyTree implements Serializable { 
... 

    ObjectOutputStream out = null; 
    try { 
     out = new ObjectOutputStream(new FileOutputStream("xxx.dat")); 
     out.writeObject(tree); 
    } 

... 
+1

직렬화는 Java에서 거대한 오버 헤드를 가지고 있습니다. 물론 직접 구현하지 않는 한. 하지만 (큰) 컬렉션의 경우 일반적으로 나쁜 생각입니다 ... –

+0

하지만 반대쪽에서 node.value()? 만약 당신이 어떤 프리미티브보다 큰 객체를 저장하고 싶다면 어떻게하겠습니까? 이진 트리는 정수 이상을 저장할 수 있습니다. 그리고 직렬화는 매우 쉬운 방법입니다. 어떻게 처리해야합니까? 그리고 텍스트 파일과 같은 Stoirng 객체는 직렬화보다 훨씬 낫지 않다. – Kousalik

+1

나는 그것이 쉽다는 것에 동의한다. 따라서 성능에 상관하지 않는다면 괜찮다. 하지만 직렬화 란 전체 클래스를 패킹한다는 의미로, 참조 및 클래스와 모든 값을 파일에 포함한다는 것을 기억하십시오. 많은 데이터 구조가 필요합니다. 나는 그것이 작동하지 않을 것이라고 말하는 것이 아니지만 성능이 좋지 않습니다. –