Skip to content

Instantly share code, notes, and snippets.

@ecabuk
Created April 19, 2017 08:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ecabuk/4d2bbc989e89eb12101bfddf4ad55fcc to your computer and use it in GitHub Desktop.
Save ecabuk/4d2bbc989e89eb12101bfddf4ad55fcc to your computer and use it in GitHub Desktop.
class Node:
freq = None
left = None
right = None
letter = None
def __init__(self, freq, left=None, right=None, letter=None):
self.freq = freq
self.left = left
self.right = right
self.letter = letter
def build_tree(freqs):
l = [Node(x, None, None, freqs[x]) for x in freqs.keys()]
i = 0
while len(l) > i + 1:
(a, b) = l[i:i + 2]
s = a.freq + b.freq
idx = next((index for index, node in enumerate(l) if node.freq > s), len(l))
l.insert(idx, Node(s, a, b))
i += 2
return l[-1]
def decode(tree, code):
decoded = []
node = tree
for i in code:
node = node.left if i == str(0) else node.right
if not node.left and not node.right:
decoded.append(str(node.letter))
node = tree
continue
return ''.join(decoded)
def main():
tree = build_tree({
20: 'R',
25: 'B',
30: 'L',
33: 'G',
43: 'I',
70: 'A',
79: 'E'
})
decoded = decode(tree, '1111110000001110000101110')
print(decoded)
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment