using
System;
using
System.Collections.Generic;
public
class
HuffmanTreeNode
: IComparable<HuffmanTreeNode> {
public
char
Data
{
get
;
set
;
}
public
int
Freq
{
get
;
set
;
}
public
HuffmanTreeNode Left
{
get
;
set
;
}
public
HuffmanTreeNode Right
{
get
;
set
;
}
public
HuffmanTreeNode(
char
character,
int
frequency)
{
Data = character;
Freq = frequency;
Left = Right =
null
;
}
public
int
CompareTo(HuffmanTreeNode other)
{
return
Freq - other.Freq;
}
}
public
class
GFG {
private
const
int
MaxSize = 100;
private
static
void
PrintCodes(HuffmanTreeNode root,
int
[] arr,
int
top)
{
if
(root.Left !=
null
) {
arr[top] = 0;
PrintCodes(root.Left, arr, top + 1);
}
if
(root.Right !=
null
) {
arr[top] = 1;
PrintCodes(root.Right, arr, top + 1);
}
if
(root.Left ==
null
&& root.Right ==
null
) {
Console.Write(root.Data +
" "
);
for
(
int
i = 0; i < top; ++i) {
Console.Write(arr[i]);
}
Console.WriteLine();
}
}
private
static
HuffmanTreeNode
GenerateTree(SortedList<
int
, HuffmanTreeNode> list)
{
while
(list.Count != 1) {
HuffmanTreeNode left = list.Values[0];
list.RemoveAt(0);
HuffmanTreeNode right = list.Values[0];
list.RemoveAt(0);
HuffmanTreeNode node =
new
HuffmanTreeNode(
'$'
, left.Freq + right.Freq);
node.Left = left;
node.Right = right;
list.Add(node.Freq, node);
}
return
list.Values[0];
}
public
static
void
HuffmanCodes(
char
[] data,
int
[] freq,
int
size)
{
SortedList<
int
, HuffmanTreeNode> list
=
new
SortedList<
int
, HuffmanTreeNode>();
for
(
int
i = 0; i < size; i++) {
HuffmanTreeNode newNode
=
new
HuffmanTreeNode(data[i], freq[i]);
list.Add(freq[i], newNode);
}
HuffmanTreeNode root = GenerateTree(list);
int
[] arr =
new
int
[MaxSize];
int
top = 0;
PrintCodes(root, arr, top);
}
public
static
void
Main(
string
[] args)
{
char
[] data = {
'a'
,
'b'
,
'c'
,
'd'
,
'e'
,
'f'
};
int
[] freq = { 5, 9, 12, 13, 16, 45 };
int
size = data.Length;
HuffmanCodes(data, freq, size);
}
}