哈夫曼树

哈弗曼树:即最优树,是一类带权路径长度最短的树。

哈夫曼树的存储表示:

typedef struct Node
{
int weight;                //结点的权值
int parent,lchild,rchild;       //结点的双亲、左孩子、右孩子的下标
}HTNode,*HuffmanTree;      //动态分配数组存储哈弗曼树

构造哈弗曼树:

void CreateHuffmanTree(HuffmanTree& HT, int n)
{
    int i, m, s1, s2;
    m = 2 * n - 1;  // 总结点的个数
    HT = new HTNode[m + 1]; // 分配m+1个单元,HT[m]表示根节点
    for (i = 1; i <= m; ++i) // 1 - n 存放叶子结点,初始化
    {
        HT[i].parent = 0;
        HT[i].lchild = 0;
        HT[i].rchild = 0;
    }
    for (i = 1; i <= n; ++i)  //输入前n个单元中叶子结点的权值
    {
        cin >> HT[i].weight;
    }

    for (int i = n + 1; i <= m; ++i)     // 通过n-1次的选择、删除、合并来创建哈夫曼树
    {   // 在HT[1]~HT[i-1]的范围内选择两个parent为0且weight最小的两个结点,其序号分别赋值给 s1 s2
        Select(&HT, i - 1, &s1, &s2);
        HT[s1].parent = i;  // 得到新结点i,删除s1、s2两个结点,将s1、s2的双亲域由0改为i
        HT[s2].parent = i;
        HT[i].lchild = s1;      //s1和s2分别作为i的左右孩子
        HT[i].rchild = s2;
        HT[i].weight = HT[s1].weight + HT[s2].weight;   // i的权值是左右孩子之和
    }
}

根据哈弗曼树求哈夫曼编码:

void CreateHuffmanCode(HuffmanTree HT, HuffmanCode& HC, int n)
{
    HC = new char* [n + 1];//分配存储n个字符编码的编码表空间
    char*cd = new char[n];//分配临时存放每个字符编码的动态数组空间
    cd[n - 1] = '\0';//编码结束符 
    for (int i = 1; i <= n; ++i) //逐个字符求哈夫曼编码
    {
        int start = n - 1, c = i, f = HT[f].parent;
        while (f != 0)
        {
            --start;   //回溯一次start向前指一个位置
            if (HT[f].lchild == c) //c是f的左孩子,生成代码0,是右孩子,生成1
            {
                cd[--start] = '0';
            }
            else cd[--start] = '1';
            c = f;                         //继续向前回溯
            f = HT[f].parent;
        }
        HC[i] = new char[n = start];//为第i个字符编码分配空间 
        strcpy(HC[i], &cd[start]);//将求得的编码从临时空间cd复制到HC的当前行中
    }
    delete cd; //释放临时空间 
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
哈夫曼树(Huffman Tree)是一种特殊的二叉树,用于数据压缩和编码。它的构建过程是根据字符出现的频率来确定每个字符的编码,使得出现频率高的字符具有较短的编码,而出现频率低的字符具有较长的编码。 以下是一个Python实现的哈夫曼树的例子: ```python class TreeNode: def __init__(self, value, freq): self.value = value self.freq = freq self.left = None self.right = None def build_huffman_tree(char_freq): nodes = [TreeNode(char, freq) for char, freq in char_freq.items()] while len(nodes) > 1: nodes = sorted(nodes, key=lambda x: x.freq) left_node = nodes.pop(0) right_node = nodes.pop(0) parent_node = TreeNode(None, left_node.freq + right_node.freq) parent_node.left = left_node parent_node.right = right_node nodes.append(parent_node) return nodes[0] def encode_huffman_tree(root, code='', codes={}): if root is None: return if root.value is not None: codes[root.value] = code encode_huffman_tree(root.left, code + '0', codes) encode_huffman_tree(root.right, code + '1', codes) return codes def decode_huffman_tree(root, encoded_text): decoded_text = '' current_node = root for bit in encoded_text: if bit == '0': current_node = current_node.left else: current_node = current_node.right if current_node.value is not None: decoded_text += current_node.value current_node = root return decoded_text # 示例用法 char_freq = {'a': 5, 'b': 9, 'c': 12, 'd': 13, 'e': 16, 'f': 45} huffman_tree = build_huffman_tree(char_freq) huffman_codes = encode_huffman_tree(huffman_tree) encoded_text = ''.join([huffman_codes[char] for char in 'abcdef']) decoded_text = decode_huffman_tree(huffman_tree, encoded_text) print("Huffman Codes:", huffman_codes) print("Encoded Text:", encoded_text) print("Decoded Text:", decoded_text) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值