问题描述:给定一个字符集合及其出现频率,为这些字符构建一个最优的二进制编码,使得总编码长度最短 贪心策略 每次选择出现频率最低的两个字符构建新的子树,并更新频率表 直到所有字符构建成一棵哈夫曼树 实现代码 class HuffmanNode { constructor(char, freq, left = null, right = null) { this.char = char; this.freq = freq; this.left = left; this.right = right; } } function huffmanCoding(chars, freqs) { let nodes = chars.map((char, i) => new HuffmanNode(char, freqs[i])); while (nodes.length > 1) { nodes.sort((a, b) => a.freq - b.freq); let left = nodes.shift(); let right = nodes.shift(); let newNode = new HuffmanNode(null, left.freq + right.freq, left, right); nodes.push(newNode); } return nodes[0]; } function generateHuffmanCodes(node, prefix = "", codes = {}) { if (!node) return; if (node.char !== null) { codes[node.char] = prefix; } generateHuffmanCodes(node.left, prefix + "0", codes); generateHuffmanCodes(node.right, prefix + "1", codes); return codes; } // 测试代码 const chars = ['a', 'b', 'c', 'd', 'e', 'f']; const freqs = [5, 9, 12, 13, 16, 45]; const huffmanTree = huffmanCoding(chars, freqs); const huffmanCodes = generateHuffmanCodes(huffmanTree); console.log(huffmanCodes); // 输出哈夫曼编码