2012-12-07 4 views
0

나는 허프만 encodoing 트리 코딩 오전 및 오류가 나타납니다.StackOverFlow 오류/재귀 호출

5:1 
5:4 
5:2 
5:1 
5:4 
5:2 
5:1 
5:4 
5:2 
5:1 
Exception in thread "main" java.lang.StackOverflowError 
at sun.nio.cs.SingleByteEncoder.encodeLoop(SingleByteEncoder.java:130) 
at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:544) 
at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:252) 
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:106) 
at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190) 
at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111) 
at java.io.PrintStream.write(PrintStream.java:476) 
at java.io.PrintStream.print(PrintStream.java:619) 
at java.io.PrintStream.println(PrintStream.java:756) 
at HuffmanNode.buildTree(hw4.java:65) 
at HuffmanNode.buildTree(hw4.java:66) 
at HuffmanNode.buildTree(hw4.java:66) 
at HuffmanNode.buildTree(hw4.java:66) 
at HuffmanNode.buildTree(hw4.java:66) 

물론, I는() buildTree에서 무한 recusive 방법이있다. 그러나, 나는 그것이 무엇을하고 있는지 이해하지 못한다. 나는이 잠시 동안 있었다 꽤 좌절대로

public void buildTree(HuffmanNode node){ 
    if (node.compareTo(this) <= 0 && left != null){ 
    System.out.println(node.getCount() + ":" + this.count); 
    left.buildTree(node); 
    } 
    else if (node.compareTo(this) <= 0 && left == null){ 
    this.left = node; 
    node.parent = this; 
    } 
    else if (node.compareTo(this) > 0 && right != null){ 
    System.out.println(node.getCount() + ":" +this.count); 
    right.buildTree(node); 
    } 
    else if (node.compareTo(this) > 0 && right == null){ 
    this.right = node; 
    node.parent = this; 
    } 
} 

은 내 전체 코드 입력 파일을 크게 감상 할 수

어떤 통찰력 Here을 볼 수 있습니다.

+0

업데이트 때문에 페이스트 빈 코드 라인 – user1093111

+1

당신이 있습니까 오류를 일치되어 루프가 끝날 때

 if (root == null) { root = result; } else { root.buildTree(result); } 

그런 다음 당신은 root 인, huffmanList에 하나의 노드 만이있을 것이다 재귀 함수의 정지 조건? –

+0

글쎄, 그것은 156-160에 내려야 만했습니다. 루트 값에 도달하면 root = 결과를 얻은 다음 root.genCode()를 사용하여 이진 파일을 인쇄합니다. 하지만 내 논리가 잘못 될 수 있습니다. – user1093111

답변

0

setParent (HuffmanNode right)에서 this.left = left를 수행합니다. 아무 것도하지 않습니다. 이것은 첫 번째 단계 후 오류

+0

코드에서 아무 것도 사용되지 않습니다. – hoaz

+0

ha, whoops. 내 이전 생각의 일부 였음에 틀림 없다. – user1093111

1

을해야합니다, 당신의 나무는 다음과 같습니다

root 
/\ 
    - 
/\ 
    M Z 

당신이 두 번째 단계를 수행

당신은 잘못 Z 새로운 result 노드를 연결합니다. 두 번째 단계 후에 나무가 부러지고 세 번째 단계가 무한 재귀로 이동합니다.

편집 : 좋아, 그냥 다시 알고리즘을 읽고 나는 당신이 할 일은 결과 노드를 만드는 것입니다 생각합니다. 그냥이 줄을 제거 :

while (huffmanList.size() > 1) { 
     HuffmanNode x = huffmanList.poll(); 
     HuffmanNode y = huffmanList.poll(); 
     HuffmanNode result = new HuffmanNode("-", x.getCount() + y.getCount(), null, x, y); 
     huffmanList.add(result); 
    } 
    huffmanList.poll().genCode(" ");