题目
给定长度为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)