def mysort(arr:list):
for i in range(len(arr)):
for j in range(len(arr)):
if arr[i]<=arr[j]:
arr[i],arr[j] = arr[j],arr[i]
class HuffmanTreeNode:
def __init__ ( self, value_weight: tuple ) -> None:
self.value_weight = value_weight
self.parent: HuffmanTreeNode = None
self.leftChild: HuffmanTreeNode = None
self.rightChild: HuffmanTreeNode = None
def __eq__ ( self, other ) -> bool:
return self.value_weight[1] == other.value_weight[1]
def __ne__ ( self, other ) -> bool:
return self.value_weight[1] != other.value_weight[1]
def __ge__ ( self, other ):
return self.value_weight[1] >= other.value_weight[1]
def __le__ ( self, other ):
return self.value_weight[1] <= other.value_weight[1]
def __getitem__ ( self, item ):
return self.value_weight[item]
def __str__ ( self ) -> str:
return str(self.value_weight)
class HuffmanTree:
def __init__ ( self, seq=None,value_weight:list=None) -> None:
self.root: HuffmanTreeNode = HuffmanTreeNode(('NaN',0))
if value_weight is None:
self.value_weight = []
else:
self.value_weight = [HuffmanTreeNode(i) for i in value_weight]
self.seq = seq
if self.seq is not None:
self._value_weightList()
self._buildHuffmanTree()
self.coding={}
self._tree_to_dict(self.root,"")
def _value_weightList ( self ):
seqlist = list(self.seq)
seq_set = set(seqlist)
for i in seq_set:
self.value_weight.append(HuffmanTreeNode((i, seqlist.count(i))))
def _merge ( self, hto, htt, ht: HuffmanTreeNode ):
hto.parent = ht
htt.parent = ht
ht.leftChild = hto
ht.rightChild = htt
ht.value_weight = ('NaN', hto.value_weight[1] + htt.value_weight[1])
def