* URGENT *节点是空的错误??? (如何修复第3代码文件第54行的错误?(第3代码块) [英] *URGENT* Node was Null Error??? (how do i fix error on line 54 in 3rd code file? (3rd code block)

查看:72
本文介绍了* URGENT *节点是空的错误??? (如何修复第3代码文件第54行的错误?(第3代码块)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

using System.Collections.Generic;
using System.Linq;

namespace Huffman1
{
    internal class PriorityQueue<T>
    {
        private readonly SortedDictionary<int, Queue<T>> _sortedDictionary = new SortedDictionary<int, Queue<T>>();

        public int Count { get; private set; }

        public void Enqueue(T item, int priority)
        {
            ++Count;
            if (!_sortedDictionary.ContainsKey(priority)) _sortedDictionary[priority] = new Queue<T>();
            _sortedDictionary[priority].Enqueue(item);
        }

        public T Dequeue()
        {
            --Count;
            var item = _sortedDictionary.First();
            if (item.Value.Count == 1) _sortedDictionary.Remove(item.Key);
            return item.Value.Dequeue();
        }
    }
}





// HuffmanNode.cs
namespace Huffman1
{
    internal class HuffmanNode
    {
        public HuffmanNode Parent { get; set; }
        public HuffmanNode Left { get; set; }
        public HuffmanNode Right { get; set; }
        public char Value { get; set; }
        public int Count { get; set; }
    }
}





using System.Collections;
using System.Collections.Generic;

namespace Huffman1
{
    internal class HuffmanTree
    {
        private readonly HuffmanNode _root;
        private IDictionary counts;

        public HuffmanTree(IEnumerable<KeyValuePair<char, int>> counts)
        {
            var priorityQueue = new PriorityQueue<HuffmanNode>();

            foreach (KeyValuePair<char, int> kvp in counts)
            {
                priorityQueue.Enqueue(new HuffmanNode { Value = kvp.Key, Count = kvp.Value }, kvp.Value);
            }

            while (priorityQueue.Count > 1)
            {
                HuffmanNode n1 = priorityQueue.Dequeue();
                HuffmanNode n2 = priorityQueue.Dequeue();
                var n3 = new HuffmanNode { Left = n1, Right = n2, Count = n1.Count + n2.Count };
                n1.Parent = n3;
                n2.Parent = n3;
                priorityQueue.Enqueue(n3, n3.Count);
            }

            _root = priorityQueue.Dequeue();
        }

        public HuffmanTree(IDictionary counts)
        {
            this.counts = counts;
        }

        public IDictionary<char, string> CreateEncodings()
        {
            var encodings = new Dictionary<char, string>();
            Encode(_root, "", encodings);
            return encodings;
        }

        private void Encode(HuffmanNode node, string path, IDictionary<char, string> encodings)
        {
            if (node?.Left != null)
            {
                Encode(node.Left, path + "0", encodings);
                Encode(node.Right, path + "1", encodings);
            }
            else
            {
                encodings.Add(node.Value,path);
            }
        }
    }
}





using System;
using System.Collections;
using System.Collections.Generic;

namespace Huffman1
{
    class Program
    {
        static void Main(string[] args)
        {
            IDictionary counts = new Dictionary<char, int>();
            // ac bca ba z
            counts.Add(' ', 3);
            counts.Add('b', 2);
            counts.Add('a', 3);
            counts.Add('c', 2);
            counts.Add('z', 1);
            counts.Add('\n', 1);
            HuffmanTree tree = new HuffmanTree(counts);
            IDictionary<char, string> encodings = tree.CreateEncodings();

            foreach (KeyValuePair<char, string> kvp in encodings)
            {
                Console.WriteLine((kvp.Key == '\n' ? "EOF" : kvp.Key.ToString()) + ":\t" + kvp.Value);
            }

            Console.ReadLine();
        }
    }
}




推荐答案

编码<跨度> <跨度>添加 <跨度>( <跨度>节点 <跨度> <跨度>值 路径 );

encodings.Add(node.Value,path);

不应该吗?代替?在前面的if语句中,节点本身可以​​为空。

Shouldn't it be ?. instead? In the previous if statement, the node itself can be null.

编码 添加 < ?跨度>节点 <跨度> <跨度>值 <跨度>, <跨度>路径 <跨度>);

encodings.Add(node?.Value,path);


这篇关于* URGENT *节点是空的错误??? (如何修复第3代码文件第54行的错误?(第3代码块)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆