-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHuffman_Coding.cpp
More file actions
127 lines (104 loc) · 2.66 KB
/
Copy pathHuffman_Coding.cpp
File metadata and controls
127 lines (104 loc) · 2.66 KB
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <iostream>
#include <string>
using namespace std;
struct Node
{
char data;
int frequency;
Node* left;
Node* right;
Node(char d, int freq) : data(d), frequency(freq), left(nullptr), right(nullptr) {}
};
struct MinHeapNode
{
Node* node;
MinHeapNode* next;
MinHeapNode(Node* n) : node(n), next(nullptr) {}
};
class MinHeap
{
private:
//MinHeapNode* head;
public:
MinHeap() : head(nullptr) {}
MinHeapNode* head;
void push(Node* newNode)
{
MinHeapNode* newNodePtr = new MinHeapNode(newNode);
if (!head || newNode->frequency < head->node->frequency)
{
newNodePtr->next = head;
head = newNodePtr;
}
else
{
MinHeapNode* current = head;
while (current->next && current->next->node->frequency <= newNode->frequency)
{
current = current->next;
}
newNodePtr->next = current->next;
current->next = newNodePtr;
}
}
Node* pop()
{
if (!head) return nullptr;
MinHeapNode* temp = head;
head = head->next;
Node* poppedNode = temp->node;
delete temp;
return poppedNode;
}
bool isEmpty()
{
return head == nullptr;
}
};
Node* buildHuffmanTree(char data[], int freq[], int size)
{
MinHeap minHeap;
for (int i = 0; i < size; ++i)
{
minHeap.push(new Node(data[i], freq[i]));
}
while (!minHeap.isEmpty() && minHeap.head->next)
{
Node* left = minHeap.pop();
Node* right = minHeap.pop();
Node* parent = new Node('$', left->frequency + right->frequency);
parent->left = left;
parent->right = right;
minHeap.push(parent);
}
return minHeap.pop();
}
void generateCodes(Node* root, string code, string codes[])
{
if (!root) return;
if (root->data != '$')
{
codes[root->data - 'a'] = code;
}
generateCodes(root->left, code + "0", codes);
generateCodes(root->right, code + "1", codes);
}
void huffmanCodes(char data[], int freq[], int size)
{
Node* root = buildHuffmanTree(data, freq, size);
string codes[26];
generateCodes(root, "", codes);
cout << "Character code-word:" << endl;
for (int i = 0; i < size; ++i)
{
cout << data[i] << " " << codes[data[i] - 'a'] << endl;
}
}
int main()
{
char data[] = {'a', 'b', 'c', 'd', 'e', 'f'};
int freq[] = {5, 9, 12, 13, 16, 45};
int size = sizeof(data) / sizeof(data[0]);
huffmanCodes(data, freq, size);
return 0;
}