赞
踩
引例:将百分制的考试成绩转换成五分制的成绩,且考虑学生成绩的分布的概率
核心问题:如何根据结点不同的查找频率构造更有效的搜索树?
哈夫曼树
哈夫曼树的构造:即构造一棵二叉树,同时使得 WPL 值最小
HuffmanTree Huffman(MinHeap H) { /* 假设 H->Size 个权值已经存在 H->Elements->Weight 里 */ /* 根据哈夫曼构建思路,一共只需要循环 n-1 次 */ /* 循环结束后,此时 H 中也只有一个结点了,就是根节点 */ HuffmanTree T; BuildHeap(H); // 根据传入的 H(至少是一个完全二叉树),将 H->Elements[] 按照权值调整为最小堆 for (int i = 1; i < H->Size; i++) { T = (HuffmanTree)malloc(sizeof(HuffmanTreeNode)); T->Left = DeleteMin(H); // 从最小堆里边删除两个最小的结点,共同构建一个二叉树 T->Right = DeleteMin(H); T->Weight = T->Left->Weight + T->Right->Weight; // 更新权值 Insert(H, T); } T = DeleteMin(H); return T; }
〖例〗 有五个叶子结点,它们的权值为{1,2,3,4,5},用此权值序列可以构造出形状不同的多个二叉树。
哈夫曼树的特点
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。