求python的能人!

哈夫曼编码/译码器(**
问题描述:设字符集及频度如下表:
字符 空格 A B C D E F G H I J K L M
频度 186 64 13 22 32 103 21 15 47 57 1 5 32 20
字符 N O P Q R S T U V W X Y Z
频度 57 63 15 1 48 51 80 23 8 18 1 16 1
设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。基本要求:
(1)将权值数据存放在数据文件(文件名为data.txt,位于执行程序的当前目录中) 。
(2)初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树。
(3)编码:利用建好的哈夫曼树生成哈夫曼编码。
(4)输出编码。
(5)对给定的由“0”和“1”字符串实现译码。
(6)显示哈夫曼树。
(7)界面设计的优化。
数据结构定义如下:
#define n 7 /叶子数目/
#define m 2
n /结点总数,下标为0不用/
typedef int datatype;
typedef struct
{ float weight;
int lchild,rchild,parent;
}hufmtree;
hufmantree tree[m];
建立哈夫曼树算法描述如下:
for i=1 to n
{读入tree [i]. weight的值; tree [i].lchild= tree [i].rchild=0;}
for i=1 to m
tree [i].parent=0
for k=n+1 to M
Select ( k-1, i, j ) //从W[K-1]中选出双亲为零的两个权值最小的下标 I,J
tree [k]. weight = tree [I]. weight + tree [J]. weight;
tree [k].lchild = I ; tree [k].rchild = J;
tree [I].parent = k ; tree [J].parent = k ;
}

https://blog.csdn.net/u011710873/article/details/21548523

你给的伪码不是C的吗?还是说用python实现?

#Tree-Node Type
class Node:
    def __init__(self,freq):
        self.left =None
        self.right =None
        self.father =None
        self.freq = freq
    def isLeft(self):
        return self.father.left == self
#create nodes创建叶⼦节点

def createNodes(freqs):
    return[Node(freq)for freq in freqs]
#create Huffman-Tree创建Huffman树
def createHuffmanTree(nodes):
    queue = nodes[:]
    while len(queue)>1:
        queue.sort(key=lambda item:item.freq)
        node_left = queue.pop(0)
        node_right = queue.pop(0)
        node_father = Node(node_left.freq + node_right.freq)
        node_father.left = node_left
        node_father.right = node_right
        node_left.father = node_father
        node_right.father = node_father
        queue.append(node_father)
    queue[0].father =None
    return queue[0]
#Huffman编码
def huffmanEncoding(nodes,root):
    codes =['']*len(nodes)
    for i in range(len(nodes)):
        node_tmp = nodes[i]
        while node_tmp != root:
            if node_tmp.isLeft():
                codes[i]='0'+ codes[i]
            else:
                codes[i]='1'+ codes[i]
            node_tmp = node_tmp.father
    return codes
#解压缩huffman文件
 
def decode_huffman(input_string,  char_store, freq_store):
    #input_string 哈夫曼编码
    #char_store 字符集合
    #freq_store 字符转编码01序列
    encode =''
    decode =''
    for index in range(len(input_string)):
        encode = encode + input_string[index]
        for item in zip(char_store, freq_store):
            if encode == item[1]:
                decode = decode + item[0]
                encode =''
    return decode
#获取Huffman编码

def getHuffmanCode(char, freq):
    dict1 = dict(zip(char,freq))
    #for  i in string:
    #    if i in dict1.keys():
    #        dict1[i]+=1
    #    else:
    #        dict1[i]=1
    #将字符根据频次排序
    chars_freqs  =sorted(dict1.items(), key =lambda kv:(kv[1], kv[0]))
    #创建huffman节点树
    nodes = createNodes([item[1]for item in chars_freqs])
    root = createHuffmanTree(nodes)
    #每个字符的Huffman编码
    codes = huffmanEncoding(nodes,root)
    #print codes
    dict2 ={}
    for item in zip(chars_freqs,codes):
    #print 'Character:%s freq:%-2d   encoding: %s' % (item[0][0],item[0][1],item[1])
        dict2[item[0][0]]= item[1]
    str=''
    for v in char:
        str+= dict2[v]
    return [str,dict2]
n = input("输入字母个数:")
n_c = input("输入字母:").split(" ")
n_w = input("输入字母权重:").split(" ")
print(getHuffmanCode(n_c, n_w))

print(decode_huffman("000000000000010000000010000000100000010000010001001011", n_c, "000000001"))