华为OD机试统一考试 - 生成哈夫曼树

题目描述

给定长度为 n 的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于 1 。

请完成一个函数,根据输入的数字数组,生成哈夫曼树,并将哈夫曼树按照中序遍历输出。

为了保证输出的二叉树中序遍历结果统一,增加以下限制:

  • 在树节点中,左节点权值小于等于右节点权值,根节点权值为左右节点权值之和。
  • 当左右节点权值相同时,左子树高度高度小于等于右子树。

注意: 所有用例保证有效,并能生成哈夫曼树提醒:哈夫曼树又称最优二叉树,是一种带权路径长度最短的一叉树。

所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为 0 层,叶结点到根结点的路径长度为叶结点的层数)

输入描述

例如:由叶子节点 5 15 40 30 10 生成的最优二叉树如下图所示,该树的最短带权路径长度为 40∗1+30∗2+15∗3+5∗4+10∗4=205。

输出描述

输出一个哈夫曼的中序遍历数组,数值间以空格分隔

示例1

输入:
5
5 15 40 30 10

输出:
40 100 30 60 15 30 5 15 10

说明:
根据输入,生成哈夫曼树,按照中序遍历返回。所有节点中,左节点权值小于等于右节点权值之和。当左右节点权值相同时左子树高度小于右子树。结果如上图

题解

//
//  Test_3.swift
//  SwiftODTest
//
//  Created by jdm on 9/6/24.
//

import Foundation

// 定义哈夫曼节点
class HuffmanNode {
    var value: Int
    var left: HuffmanNode?
    var right: HuffmanNode?
    init(value: Int) {
        self.value = value
    }

    // 在树节点中,左节点权值小于等于右节点权值,根节点权值为左右节点权值之和。
    // 当左右节点权值相同时,左子树高度高度小于等于右子树。
    init(left: HuffmanNode, right: HuffmanNode) {
        self.value = left.value + rig

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2024华为OD机试卷题 文章被收录于专栏

本专栏给大家提供了华为2024最新华为OD 题目汇总。华为OD机试刷题记录机考算法题库,帮助你上岸华为。提供C++/Java、JavaScript、Python四种语言的解法。

全部评论

相关推荐

05-12 17:28
已编辑
门头沟学院 硬件开发
ldf李鑫:不说公司名祝你以后天天遇到这样的公司
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务