1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| struct HuffmanNode { int left, right; int parent; int weight; char data; HuffmanNode(int left = -1, int right = -1, int parent = -1, int weight = 0, char data = '*') : left(left), right(right), parent(parent), weight(weight), data(data) {} };
vector<HuffmanNode> createHuffmanTree(vector<int>& weight, vector<char>& data) { int n = weight.size(); vector<HuffmanNode> huffmanTree(2 * n); priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q; for (int i = 0; i < n; ++i) { huffmanTree[i].data = data[i]; huffmanTree[i].weight = weight[i]; q.emplace(weight[i], i); } for (int i = 0; i < n - 1; ++i) { auto [weight1, idx1] = q.top(); q.pop(); auto [weight2, idx2] = q.top(); q.pop(); huffmanTree[idx1].parent = n + i; huffmanTree[idx2].parent = n + i; huffmanTree[n + i].left = idx1; huffmanTree[n + i].right = idx2; huffmanTree[n + i].weight = weight1 + weight2; q.emplace(weight1 + weight2, n + i); } return huffmanTree; }
void printHuffmanCode(vector<HuffmanNode>& huffmanTree) { stack<int> s; for (int i = 0; i < huffmanTree.size() / 2; ++i) { int cur = i; int pre = huffmanTree[cur].parent; while (pre != -1) { if (huffmanTree[pre].left == cur) { s.emplace(0); } else { s.emplace(1); } cur = pre; pre = huffmanTree[cur].parent; } cout << huffmanTree[i].data << " "; while (!s.empty()) { cout << s.top(); s.pop(); } cout << endl; } }
|