diff --git a/dyn_huffman.py b/dyn_huffman.py
index 96a9b17d7ffd69ba87c15cd1846c60e25275079d..494bfb1113f9cd72f240af23202a62f63fabd44d 100644
--- a/dyn_huffman.py
+++ b/dyn_huffman.py
@@ -1,5 +1,4 @@
 from __future__ import annotations
-import code
 from dataclasses import dataclass
 import numpy as np
 import pprint
@@ -8,6 +7,7 @@ import argparse
 import string
 
 LIST_ALPHABET = list(string.ascii_lowercase) + list(string.digits)
+# LIST_ALPHABET = list(string.ascii_lowercase)
 DICT_ALPHABET = {item: index + 1 for index, item in enumerate(LIST_ALPHABET)}
 
 @dataclass
@@ -28,19 +28,54 @@ def swap(tree: Node):
             tree.left = tmp
 
 
+# def compute_prefix(tree: Node, char: str) -> str:
+#     prefix = ''
+#
+#     if tree:
+#         if tree.value == char:
+#             return ''
+#
+#         if tree.left:
+#             prefix = '0' + compute_prefix(tree.left, char)
+#
+#         if tree.right:
+#             prefix = '1' + compute_prefix(tree.right, char)
+#
+#     return prefix
+
+def compute_prefix(tree: Node, char: str) -> str:
+    if tree.value == char:
+        return ''
+    
+    if tree.left:
+        left_result = compute_prefix(tree.left, char)
+        if left_result is not None:
+            return '0' + left_result
+    
+    if tree.right:
+        right_result = compute_prefix(tree.right, char)
+        if right_result is not None:
+            return '1' + right_result
+
+    return None  # char not found in this subtree
+
+
+
+
 def find_char(tree: Node, char: str) -> Node | None:
     if tree:
-        if tree.right:
-            _ = find_char(tree.right, char)
+        if tree.value == char:
+            return tree
 
         if tree.left:
-            _ = find_char(tree.left, char)
+            n = find_char(tree.left, char)
+            if n:
+                return n
 
-        if tree.value == char:
-            print(tree)
-            return tree
-        else:
-            return None
+        if tree.right:
+            n = find_char(tree.right, char)
+            if n:
+                return n
 
 
 
@@ -92,25 +127,48 @@ def compute_code(char: str):
         return bin(bin_val)[2:].zfill(e)
 
 
-def main(string: str) -> None:
+def encode(string: str) -> list[str]:
     tree = Node()
-    fixed_code = []
+    encoded: list[str] = []
+    seen: set[str] = set()
 
     for c in string:
-        fixed_code.append(compute_code(c))
-    
-    pprint.pp(fixed_code)
-
-    for c in string:
-        pprint.pp(tree)
-        print(f'\n====== Inserting \'{c}\' ======\n')
         insert_char(tree, c)
+        prefix = find_char(tree, c)
 
-    pprint.pp(tree)
+        if c not in seen:
+            seen.add(c)
+            encoded.append(prefix.nyt_code)
+            encoded.append(compute_code(c))
+        else:
+            encoded.append(compute_prefix(tree, c))
 
-    n = find_char(tree, 'k')
+    return ' '.join(encoded)[1:]
 
-    pprint.pp(n)
+
+def main(string: str) -> None:
+    msg = encode(string)
+    print(msg)
+
+# def main(string: str) -> None:
+#     tree = Node()
+#     fixed_code = []
+#
+#     for c in string:
+#         fixed_code.append(compute_code(c))
+#
+#     pprint.pp(fixed_code)
+#
+#     for c in string:
+#         pprint.pp(tree)
+#         print(f'\n====== Inserting \'{c}\' ======\n')
+#         insert_char(tree, c)
+#
+#     pprint.pp(tree)
+#
+#     n = find_char(tree, 'o')
+#
+#     pprint.pp(n)
 
 
 if __name__ == "__main__":