Note that there are some explanatory texts on larger screens.

plurals
  1. POInfinite Recursion, StackOverError in huffman tree
    text
    copied!<p>I am working on a Huffman Encoding program and I am almost finished but I am stuck in an infinite recursion loop. Does anyone have an idea where this is going wrong? </p> <p>This is the error I am getting:</p> <pre><code>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:63) at HuffmanNode.buildTree(hw4.java:64) at HuffmanNode.buildTree(hw4.java:64) at HuffmanNode.buildTree(hw4.java:64) at HuffmanNode.buildTree(hw4.java:64) at HuffmanNode.buildTree(hw4.java:64) at HuffmanNode.buildTree(hw4.java:64) at HuffmanNode.buildTree(hw4.java:64) </code></pre> <p>and the output is continually 5:1, 5:4, 5:2, repeating</p> <p>my datafile looks like this:</p> <pre><code>a a a a d d d d d d d d k k k k k k f f f f f f h h h h h h b b b b b b b b n n n n n n n e e e e e i i i i i i i i l k j a n s g l k j a s v o i j a s d l k g k n m a s d k l o v h a s d g z </code></pre> <p>and my code is </p> <pre><code> import java.util.*; import java.io.*; class HuffmanNode implements Comparable&lt;HuffmanNode&gt;{ HuffmanNode right; HuffmanNode left; HuffmanNode parent; int count; String letter; public HuffmanNode(){} public HuffmanNode (String letter, int count){ this.letter = letter; this.count = count; } public HuffmanNode (String letter, int count, HuffmanNode parent, HuffmanNode left, HuffmanNode right){ this.letter = letter; this.count = count; this.left = left; this.right = right; this.parent = parent; } public void setCount(int count){ this.count = count; } public int getCount(){ return count; } public void setRight(HuffmanNode right){ this.right = right; } public HuffmanNode getRight(HuffmanNode right){ return right; } public void setLeft(HuffmanNode left){ this.left = left; } public HuffmanNode getLeft(HuffmanNode left){ return left; } public void setParent(HuffmanNode right){ this.left = left; } public HuffmanNode getParent(HuffmanNode parent){ return parent; } public void buildTree(HuffmanNode node){ if (node.compareTo(this) &lt;= 0 &amp;&amp; left != null){ System.out.println(node.getCount() + ":" + this.count); left.buildTree(node); } else if (node.compareTo(this) &lt;= 0 &amp;&amp; left == null){ this.left = node; node.parent = this; } else if (node.compareTo(this) &gt; 0 &amp;&amp; right != null){ System.out.println(node.getCount() + ":" +this.count); right.buildTree(node); } else if (node.compareTo(this) &gt; 0 &amp;&amp; right == null){ this.right = node; node.parent = this; } } public int compareTo(HuffmanNode x){ return this.count - x.count; } public void genCode(String s){ if(left != null){ left.genCode(s + "0"); } if(right != null){ right.genCode(s + "1"); } if (left == null &amp;&amp; right == null){ System.out.println(s); } } } public class hw4{ public static void main (String []args)throws IOException{ //ask user to enter file name System.out.printf("Enter a file location and name to encode [press Enter]: "); Scanner input = new Scanner(System.in); String filename = input.next(); //Gets file name from Scanner and checks to see if valid File file = new File(filename); //if (!file.isFile()){ //System.out.printf("Enter a file location and name to encode [press Enter]: "); //} Scanner text = new Scanner(file); String[] letters = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}; int[] freq = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; String letter; String tempStr; int tempInt; while(text.hasNext()){ letter = text.next(); //System.out.printf("%s\n", letter); char c = letter.charAt(0); int index = c - 97; freq[index]++; } for(int i=0; i &lt;25; i++){ System.out.printf("%s:%d\n", letters[i], freq[i]); } System.out.printf("\n"); for (int n=0; n &lt;25; n++) { for (int i=0; i &lt;25; i++) { if (freq[i] &gt; freq[i+1]) { // exchange elements tempInt = freq[i]; tempStr = letters[i]; freq[i] = freq[i+1]; letters[i] = letters[i+1]; freq[i+1] = tempInt; letters[i+1] = tempStr; } } } PriorityQueue&lt;HuffmanNode&gt; huffmanList = new PriorityQueue&lt;HuffmanNode&gt;(); for(int i=0; i &lt;26; i++){ System.out.printf("%s:%d\n", letters[i], freq[i]); if(freq[i] &gt; 0){ huffmanList.add(new HuffmanNode(letters[i],freq[i])); } } HuffmanNode root = new HuffmanNode(); while(huffmanList.size() &gt; 1){ HuffmanNode x = huffmanList.poll(); HuffmanNode y = huffmanList.poll(); HuffmanNode result = new HuffmanNode("-", x.getCount() + y.getCount(), null, x, y); if(root == null){ root = result; } else{ root.buildTree(result); } huffmanList.add(result); } root.genCode(" "); } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload