生成哈夫曼树

题目
给定长度为n的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于1.
请完成一个函数,根据输入的数字数组,生成哈夫曼树,并将哈夫曼树按照中序遍历输出。
为了保证输出的二叉树中序遍历结果统一,增加限制:二叉树节点中,左节点权值小于右节点权值,根节点权值为左右节点权值之
和。当左右节点权值相同时,左子树高度小于等于右子树高度。
输入
5
5 15 40 30 10
输出
40 100 30 60 15 30 5 15 10
解题思路
读取数字数组的长度和具体数值,然后利用输入的数组构建哈夫曼树,并对构建好的哈夫曼树进行中序遍历,最后将中序遍历的结果输出。
 

import heapq

class TreeNode:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

    def __lt__(self, other):
        # 定义小于运算,用于优先队列中的比较
        if self.value != other.value:
            return self.value < other.value
        else:
            # 如果权值相同,比较子树的高度
            self_height = self.height()
            other_height = other.height()
            return self_height <= other_height

    def height(self):
        # 计算树的高度
        if self.left is None and self.right is None:
            return 1
        left_height = self.left.height() if self.left else 0
        right_height = self.right.height() if self.right else 0
        return max(left_height, right_height) + 1

def build_huffman_tree(values):
    # 创建森林,每棵树只有一个节点
    forest = [TreeNode(value) for value in values]
    heapq.heapify(forest)

    # 构建哈夫曼树
    while len(forest) > 1:
        left = heapq.heappop(forest)
        right = heapq.heappop(forest)
        parent = TreeNode(left.value + right.value)
        parent.left = left
        parent.right = right
        heapq.heappush(forest, parent)

    # 返回哈夫曼树的根节点
    return forest[0]

def inorder_traversal(root):
    # 中序遍历哈夫曼树
    if root is None:
        return
    inorder_traversal(root.left)
    print(root.value, end=' ')
    inorder_traversal(root.right)

# 输入处理
n = int(input())
values = list(map(int, input().split()))

# 构建哈夫曼树
huffman_tree = build_huffman_tree(values)

# 中序遍历并输出结果
inorder_traversal(huffman_tree)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值