博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
哈夫曼树的实现
阅读量:5899 次
发布时间:2019-06-19

本文共 2720 字,大约阅读时间需要 9 分钟。

本来用之前也过的堆直接实现比较好,这里我直接重新写一了函数融入进去了

1 #pragma once  2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 8 template
9 struct HuffmanNode 10 { 11 T _value; 12 HuffmanNode* _left; 13 HuffmanNode* _right; 14 HuffmanNode(T x) 15 :_value(x) 16 , _left(NULL) 17 , _right(NULL) 18 { 19 20 } 21 }; 22 23 template
24 class HuffmanTree 25 { 26 public: 27 HuffmanTree() 28 :_root(NULL) 29 { 30 31 } 32 HuffmanNode
*ReturnRootNode() 33 { 34 return _root; 35 } 36 //vector
HuffmanCode(T* a,size_t size) 37 //{ 38 // vector
test; 39 // test.resize(size); 40 // for (int i = 0; i < size; ++i) 41 // { 42 // _Find(_root, test[i], a[i]); 43 // } 44 // return test; 45 //} 46 void CreateHuffmanTree(T *a, size_t size,T& invalid) 47 { 48 vector
*> v; 49 for (int i = 0; i < size; ++i) 50 { 51 if (a[i] != invalid) 52 { 53 v.push_back(new HuffmanNode
(a[i])); 54 } 55 } 56 for (int i = (v.size() - 2) / 2; i >= 0; --i) 57 { 58 AdjustDown(v, i, v.size()); 59 } 60 while (v.size() > 1) 61 { 62 HuffmanNode
*left = v[0]; 63 swap(v[0], v[v.size() - 1]); 64 v.pop_back(); 65 AdjustDown(v, 0, v.size()); 66 HuffmanNode
*right = v[0]; 67 swap(v[0], v[v.size() - 1]); 68 v.pop_back(); 69 AdjustDown(v, 0, v.size()); 70 HuffmanNode
*parent = new HuffmanNode
(left->_value + right->_value); 71 parent->_left = left; 72 parent->_right = right; 73 v.push_back(parent); 74 AdjustDown(v, 0, v.size()); 75 } 76 _root = v[0]; 77 v.pop_back(); 78 } 79 protected: 80 void AdjustDown(vector
*> &a, int root, size_t size) 81 { 82 int child = root * 2 + 1; 83 while (child < size) 84 { 85 if (child + 1 < size && a[child + 1]->_value < a[child]->_value) 86 { 87 child++; 88 } 89 if (a[child]->_value < a[root]->_value) 90 { 91 swap(a[child], a[root]); 92 root = child; 93 child = root * 2 + 1; 94 } 95 else 96 { 97 break; 98 } 99 }100 }101 /*HuffmanNode
*_Find(HuffmanNode
*root,string &str, const T &x)102 {103 if (root == NULL)104 {105 str.pop_back();106 return NULL;107 }108 if (root->_value == x && root->_left==NULL && root->_right==NULL)109 {110 return root;111 }112 else113 {114 str.push_back('0');115 HuffmanNode
*tmp = _Find(root->_left,str, x);116 if (root->_left && tmp)117 {118 return tmp;119 }120 else121 {122 str.push_back('1');123 HuffmanNode
*tmp2 = _Find(root->_right, str, x);124 if (tmp == NULL && tmp2 == NULL)125 {126 str.pop_back();127 }128 return tmp2;129 }130 }131 return NULL;132 }*/133 134 protected:135 HuffmanNode
*_root;136 };

注释部分的代码,是用来进行哈夫曼编码的,这种编码方式就不需要使用三叉链的树了(带有parent指针的三叉树)

 

转载于:https://www.cnblogs.com/lenomirei/p/5397769.html

你可能感兴趣的文章
由扭结理论中的琼斯多项式的证明想到的
查看>>
淘宝Hadoop集群的概况
查看>>
Centos7安装rabbitmq server 3.6.0
查看>>
关于eclipse的ADT(插件)对xml的android:text属性检查修改
查看>>
Mvc 提交表单的4种方法全程详解
查看>>
iostat命令学习
查看>>
SQL 三种分页方式
查看>>
查看linux是ubuntu还是centos
查看>>
html video的url更新,自动清缓存
查看>>
IOS Xib使用——为控制器添加Xib文件
查看>>
CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙步骤
查看>>
react 取消 eslint
查看>>
【11】ajax请求后台接口数据与返回值处理js写法
查看>>
Python菜鸟之路:Jquery Ajax的使用
查看>>
LeetCode算法题-Maximum Depth of Binary Tree
查看>>
sha1withRSA算法
查看>>
Vim和操作系统剪贴板交互
查看>>
Cox 教学视频5
查看>>
JVM类加载(4)—加载器
查看>>
public/private/protected的具体区别
查看>>