forked from Sharukesh3/GUI-Driven-Text-Compression
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHuffman_tree_visualisation.py
More file actions
80 lines (62 loc) · 2.29 KB
/
Huffman_tree_visualisation.py
File metadata and controls
80 lines (62 loc) · 2.29 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
import heapq
import matplotlib.pyplot as plt
import networkx as nx
class HuffmanNode:
def __init__(self, char, freq):
self.char = char
self.freq = freq
self.left = None
self.right = None
def __lt__(self, other):
return self.freq < other.freq
def build_huffman_tree(text):
freq = {}
for char in text:
freq[char] = freq.get(char, 0) + 1
priority_queue = [HuffmanNode(char, freq) for char, freq in freq.items()]
heapq.heapify(priority_queue)
while len(priority_queue) > 1:
left = heapq.heappop(priority_queue)
right = heapq.heappop(priority_queue)
merged = HuffmanNode(None, left.freq + right.freq)
merged.left = left
merged.right = right
heapq.heappush(priority_queue, merged)
return priority_queue[0]
def generate_huffman_codes(node, code='', codes={}):
if node:
if node.char is not None:
codes[node.char] = code
generate_huffman_codes(node.left, code + '0', codes)
generate_huffman_codes(node.right, code + '1', codes)
return codes
def position_tree(root, x, y, pos, depth=0, h_dist=2):
if root:
position_tree(root.left, x - h_dist, y - 1, pos, depth + 1, h_dist / 2)
pos[root] = (x, y)
position_tree(root.right, x + h_dist, y - 1, pos, depth + 1, h_dist / 2)
def visualize_huffman_tree(root):
G = nx.Graph()
pos = {}
position_tree(root, 0, 0, pos)
for node, (x, y) in pos.items():
G.add_node(node, pos=(x, -y), label=f"{node.char}\n{node.freq}" if node.char is not None else node.freq)
edges = [(node, node.left) for node in pos if node.left]
edges.extend([(node, node.right) for node in pos if node.right])
G.add_edges_from(edges)
node_labels = nx.get_node_attributes(G, 'label')
node_positions = nx.get_node_attributes(G, 'pos')
nx.draw(G, pos=node_positions, labels=node_labels, with_labels=True, node_size=2000, node_color='skyblue', font_size=10)
plt.show()
def main():
text = input()
root = build_huffman_tree(text)
'''
codes = generate_huffman_codes(root)
print("Huffman Codes:")
for char, code in sorted(codes.items()):
print(f"{char}: {code}")
'''
visualize_huffman_tree(root)
if __name__ == "__main__":
main()