根据给定单词的出现频度,构造一棵哈夫曼树,并输出对应的哈夫曼编码。 单词 A B C D E F G H 出现频度 9 5 3 7 6 2 1 1

img

img


怎么横向输出哈夫曼树?
根据给定单词的出现频度,构造一棵哈夫曼树,并输出对应的哈夫曼编码。 单词 A B C D E F G H 出现频度 9 5 3 7 6 2 1 1

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    答案:

    关于如何在输出哈夫曼树时实现横向显示,可以考虑使用递归的方式,将树展开为一行,然后输出每一层的节点。代码如下:

    class Node:
        def __init__(self, value=None):
            self.value = value
            self.left = None
            self.right = None
    
    def build_huffman_tree(data):
        # build a huffman tree with given data
        nodes = [Node(d) for d in data]
        while len(nodes) > 1:
            nodes = sorted(nodes, key=lambda x: x.value)
            left = nodes.pop(0)
            right = nodes.pop(0)
            parent = Node(left.value + right.value)
            parent.left = left
            parent.right = right
            nodes.append(parent)
        return nodes[0]
    
    def get_depth(node):
        # get the depth of a huffman tree
        if node is None:
            return 0
        left_depth = get_depth(node.left)
        right_depth = get_depth(node.right)
        return max(left_depth, right_depth) + 1
    
    def print_huffman_tree(root, depth):
        # print a huffman tree horizontally
        if root is None:
            return
        print_huffman_tree(root.right, depth + 1)
        print(' ' * 4 * depth, root.value)
        print_huffman_tree(root.left, depth + 1)
    
    data = [10, 15, 12, 3, 4, 13, 1]
    root = build_huffman_tree(data)
    depth = get_depth(root)
    print_huffman_tree(root, depth-1)
    

    这里使用了递归的方式,先将右子树展开,然后输出当前节点的值,最后展开左子树。为了控制每个节点之间的距离,可以在输出前加上一定长度的空格。

    具体流程如下:

    1. 构建哈夫曼树,得到根节点root。
    2. 计算哈夫曼树的深度depth。
    3. 调用print_huffman_tree(root, depth-1)来输出哈夫曼树,其中depth-1表示最后一行不需要额外的空格。
    4. 在print_huffman_tree中,先递归输出右子树。由于是横向展开,所以需要将深度depth加1。
    5. 在输出当前节点的值前,输出一定长度的空格以控制节点之间的距离。这里选择间隔4个空格。
    6. 递归输出左子树,同样需要深度加1。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

https://blog.csdn.net/m0_57382477/article/details/122117294