C# 哈夫曼树,编码错误

C# 哈夫曼树,编码错误,c#,binary-tree,traversal,huffman-code,C#,Binary Tree,Traversal,Huffman Code,当我完成我的树时,我非常高兴,但我遇到了编码问题。最频繁的字符没有得到最短的二进制代码。我的推测是递归遍历函数或节点列表的初始化有问题 主程序: public partial class MainWindow : Window { string kode; public MainWindow() { InitializeComponent(); kode = ""; } public double forhold(int

当我完成我的树时,我非常高兴,但我遇到了编码问题。最频繁的字符没有得到最短的二进制代码。我的推测是递归遍历函数或节点列表的初始化有问题

主程序:

public partial class MainWindow : Window
{
    string kode;

    public MainWindow()
    {
        InitializeComponent();
        kode = "";
    }

    public double forhold(int input, int komprimert)
    {
        int tall1 = input * 8;
        int tall2 = komprimert;
        return ((double)tall1 / (double)tall2);
    }

    public void Traverser(Node rot, string kode) //Traverse the tree
    {
        if (rot != null) 
        {
            if (rot.Venstre != null) //If the current node has a left child
            {
                 Traverser(rot.Venstre, kode+"0");
            }
            if (rot.Høyre!= null) //If the current node has a right child
            {
                 Traverser(rot.Høyre, kode+"1");
            }
            //Viser karakter med koresponderende binær kode
            if (rot.Venstre == null && rot.Høyre == null) //If the current node is a leaf
            {
                rot.kode = kode; 
                txtOutput.Text += rot.Tegn.ToString() + ": " + kode +", ";
            }
        }
    }
    //public Node FåKodeMed // 

    public void btnKomprimer_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        string input = txtInput.Text;
        bool funnet; //Found
        char karakter; //Character
        int komprimertLengde; //Not important
        txtOutput.Text = ""; 
        komprimertLengde = 0;

        if (input.Length == 0)  
        {
            txtOutput.Text = "Du må skrive noe i tekst feltet!";
        }
        else
        {
            if (input.Length == 1)
            {
                txtOutput.Text = "0";
            }
            if (input.Distinct().Count() == 1)
            {
                foreach (char c in input)
                {
                    txtOutput.Text += "0";
                }
            }
            else
            {

                List<Node> noder = new List<Node>(); //List containing nodes
                for (int i = 0; i < input.Length; i++) //Places nodes in the tree
                {
                    karakter = input[i];
                    funnet = false;
                    for (int j = 0; j< noder.Count; j++)
                    {
                        if (noder[j].erTegn(karakter) == false) //Hvis tegnet allerede eksisterer
                        {
                            noder[j].økMed1();
                            funnet = true;
                            break;
                        }
                    }
                    if (!funnet)
                    {
                        noder.Add(new Node(karakter));
                    }
                }

                //Sorter listen etter frekvens:
                var sortertListe = noder.OrderBy(c => c.Frekvens).ToList(); //Sort the list by frequency

                //noder = sortertListe;

                do
                {
                    noder.Add(new Node((noder[0].Frekvens + noder[1].Frekvens),noder[0],noder[1])); //Parent node
                    noder.RemoveAt(0);
                    noder.RemoveAt(0);
                    noder.OrderBy(c => c.Frekvens).ToList();

                }while(noder.Count >= 2);

                Node rot = new Node(noder[0]);

                Traverser(rot, "");

                //Feilen kan ligge her
                List<string> output = new List<string>(); 
                foreach (char c in input)
                {
                    for (int i = 0; i < sortertListe.Count;i++)
                    {
                        if(sortertListe[i].Tegn == c)
                        {
                            output.Add(sortertListe[i].kode);
                            break;
                        }
                    }
                }
                txtOutput.Text += "\n" + "\n";
                foreach (string s in output)
                {
                    txtOutput.Text += s;
                }

                foreach (string c in output)
                {
                    komprimertLengde += c.Length;
                }

                txtOutput.Text += "\n" + "\n";
                txtOutput.Text += "lengde på input: " + Convert.ToString((input.Length * 8)) + "\n";
                txtOutput.Text += "Lengde på komprimert: " + Convert.ToString(komprimertLengde) + "\n";
                txtOutput.Text += "Forholdet: " + Convert.ToString(forhold(input.Length,komprimertLengde));

                noder.Clear();
            }
        }
    }

我认为这里已经提供了整个解决方案

代码中的问题主要是由于排序列表实际上是按错误的顺序排序的。您可能想使用

.OrderByDescending
但是,您也可以尝试其他解决方案。例如,考虑实现优先级队列


注意:下次请使用英语,即使谷歌翻译让我感到困惑:-)

提示:如果您计划向任何人显示您的源代码,请在代码中仅使用英语标识符-无论您的国籍如何。我没有挪威键盘,所以如果我想修改你的代码,我不能轻易地输入标识符“Høyre”。此外,使用非英语标识符,分析代码要困难得多。
noder.OrderBy(c=>c.Frekvens.ToList()-不应该是
noder=noder.OrderBy(c=>c.Frekvens.ToList()?@Spook是的,Spook,你完全正确。我决定从现在起,我将用英语书写所有变量名:D@500-是的,当然,愚蠢的错误是的,谢谢你的回答!实际上,在我的学校,我们用挪威语进行变量命名(我认为这不是很好的编程实践),但在过去的几个月里,我强迫自己用英语写所有的东西=)
.OrderByDescending