我一直在研究这个Huffman树生成器:

// variable al is an array list that holds all the different characters and their frequencies
// variable r is a Frequency which is supposed to be the roots for all the leaves which holds a null string and the frequencies of the combined nodes removed from the priority queue
public Frequency buildTree(ArrayList<Frequency> al)
{
    Frequency r = al.get(0);
    PriorityQueue<Frequency> pq = new PriorityQueue<Frequency>();
    for(int i = 0; i < al.size(); i++)
    {
        pq.add(al.get(i));
    }
    /*while(pq.size() > 0)
    {
        System.out.println(pq.remove().getString());
    }*/

    for(int i = 0; i < al.size() - 1; i++)
    {
       Frequency p = pq.remove();
       Frequency q = pq.remove();
       int temp = p.getFreq() + q.getFreq();
       r = new Frequency(null, temp);
       r.left = p;
       r.right = q;
       pq.add(r);  // put in the correct place in the priority queue
    }
    pq.remove(); // leave the priority queue empty
    return(r); // this is the root of the tree built

}


代码试图做英语的是

将所有字符及其频率添加到从最低频率到最大频率的优先级队列中。
接下来,将ArrayList al的大小(包含所有字符)从前两个队列中取出,然后设置一个新的根节点,以使左子节点和右子节点成为2个节点出队,然后插入新的根节点,其中两个出节点的合并频率项目放入优先级队列。多数民众赞成在所有的方法应该做。

该方法应该用来构建霍夫曼树,但是它构建的不正确是我遵循了代码并手动构建了树,但是我在纸上得到的内容与程序不同!由其他程序生成的正确答案与我的解决方案不同。输入数据(字母和频率)为:

a 6
b 5
space 5
c 4
d 3
e 2
f 1


至于即时通讯所读取的文字则无关紧要,因为频率已经在这里。我需要做的2就是从这些频率构建树。

最佳答案

您可以试着用简单的语言写出算法,而忽略任何Java细节吗?这可以帮助您了解问题出在哪里(无论是算法还是实现代码的地方),还可以帮助人们解决问题。

无论采用哪种算法,您是否真的打算让根节点以ArrayList中的第二个元素开头? List从0而不是1开始索引。List.get(1)返回第二个元素。

public Frequency buildTree(ArrayList<Frequency> al) {
    Frequency r = al.get(1);

08-27 08:59