OD C卷 - 建立Huffman树

news2024/9/21 19:02:42

生成Huffman树 (100)

  • 给定一个数值数组weights,每个值代表二叉树叶子节点的权值(>=1);
  • 根据权值数组,生成哈夫曼树,并中序遍历输出;
  • 左节点权值<= 右节点权值,根节点权值为左右节点权值之和;
  • 左右节点权值相同时,左子树高度<=右子树;
    在这里插入图片描述
    输入描述:
    第一行输入数组长度n;
    第二行输入权值,以空格分隔;
    输出描述:
    哈夫曼树的中序遍历序列,以空格分隔;

示例1
输入:
5
5 15 40 30 10
输出:
40 100 30 60 15 30 5 15 10
思路: 建立哈夫曼树的过程

  • 以每个权值创建一个节点(只有一个树根的二叉树),放入nodes_list,并按照权值从小到大排序;
  • 取出权值最小的两个节点,进行合并,根节点权值为左右子节点的权值之和
    • 设置根节点的左子树、右子树
    • 当左右子树(根节点)权值相同时,对比两者的树高,高的子树作为右子树;
    • 统计子树的高度 max(h_left, h_right),h_left为每次取左子树;
  • 将合并后的root根节点放入nodes_list,继续以上步骤,直到nodes_list中只有一个根节点;

# 中序遍历结果
result = []
# 输入n
n = int(input().strip())
weights = [int(x) for x in input().strip().split()]
 

class TreeNode:
    def __init__(self, left, right, weight, height):
        self.left = left
        self.right = right
        self.weight = weight
        self.height = height
 

# 中序遍历
def dfs(node):
	# 中序遍历左子树
    if node.left is not None:
        dfs(node.left)
    # 中间处理根
    result.append(node.weight)
    # 中序遍历右子树
    if node.right is not None:
        dfs(node.right)
        
    
# 建立哈夫曼树
nodes_list = []
for i in range(n):
    nodes_list.append(TreeNode(None, None, weights[i], 1))

# 比较树高
def comp(o1, o2):
    if(o1.weight == o2.weight): # 权值相等
        if o1.height > o2.height:
            return 1
        else:
            return -1
    
    if o1.weight > o2.weight:
        return 1
    else:
        return -1


while True:
    if len(nodes_list) == 1:
        break
    else :
        nodes_list = sorted(nodes_list, key=lambda i:i.weight)
        node1 = nodes_list.pop(0)
        node2 = nodes_list.pop(0)
        root = TreeNode(None, None, node1.weight + node2.weight, max(node1.height, node2.height) + 1)
        if comp(node1, node2) == 1:
        	root.right = node1
        	root.left = node2
        else:
        	root.right = node2
        	root.left = node1
        nodes_list.append(root)
    
 
 
dfs(nodes_list[0]) # 传入树根,中序遍历
# 输出字符串
output_str = ""
for i in range(len(result)):
    output_str += str(result[i])
    if(i!=len(result)-1):
        output_str+=" "
print(output_str)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2047500.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git提交规范检查husky

一、Eslint 尤雨溪推荐的 prettierrc 配置&#xff0c;句尾不带分号 单引号。 尤雨溪推荐配置&#xff1a;vue-next/.prettierrc lint lint 是最著名的 C 语言工具之一&#xff0c;是由贝尔实验室 SteveJohnson 于 1979 在 PCC(PortableC Compiler) 基础上开发的静态代码分…

自己搭建远程桌面服务器-RustDesk 极简版

linux搭建RustDesk保姆间教程_rustdesk linux-CSDN博客https://blog.csdn.net/yzs2022/article/details/135136491 背景 在某公司工作&#xff0c;向日葵等远程办公软件均已屏蔽&#xff0c;无法使用&#xff08;也没有明文规定不允许使用远程控制软件&#xff09;&#xff0c…

2024批量下载知乎回答/文章/想法/专栏/视频/收藏夹,导出excel和pdf

之前分享过文章2024 批量下载知乎回答/文章/想法/专栏导出excel和pdf&#xff0c;再次更新&#xff0c;2024 批量下载知乎回答/文章/想法/专栏/视频导出 excel 和 pdf&#xff0c;今天再加上知乎收藏夹批量下载。 下载所有知乎回答以渤海小吏的号为例 https://www.zhihu.com/p…

关于SQLModel库的一些封装思路和实战,fastzdp_sqlmodel库封装过程中的一些笔记,20240817

概述 最近在对SQLModel做一些封装&#xff0c;本篇文章主要记录封装过程中的一些思路和实战代码。 实现or查询 原本的代码 from typing import Optional from sqlmodel import Field, SQLModel, create_engine, Session, select, or_class Hero(SQLModel, tableTrue):id: O…

【笔记】PUML语法使用

Sequence 时序图 类型&#xff1a;participant 1、排序 order participant NAME order NUMBER 默认是按出现定义的先后顺序排列&#xff0c;如下图。 【Sequence】未定义order的效果图 可以通过自定义改变&#xff0c;使用order关键字&#xff0c;将按ABC进行排序。 partici…

20 以太网帧格式及命名方法

以太网帧格式及命名方法 一、以太网帧格式及命名方法 &#xff08;一&#xff09;帧格式及命名标准 1.以太网帧格式 ​ 802.3 以太网帧格式 ​ 以太网帧数据的长度46-1500 ​ 以太网帧的长度64-1518 ​ 帧校验序列&#xff08;FCS&#xff09;&#xff1a;从目的地址开始…

Binance 如何使用 Quickwit 构建 100PB 日志服务(Quickwit 博客)

三年前&#xff0c;我们开源了 Quickwit&#xff0c;一个面向大规模数据集的分布式搜索引擎。我们的目标很宏大&#xff1a;创建一种全新的全文搜索引擎&#xff0c;其成本效率比 Elasticsearch 高十倍&#xff0c;配置和管理显著更简单&#xff0c;并且能够扩展到 PB 级别的数…

【无标题】乐天HIQ壁挂炉使用

这里写自定义目录标题 1.按键①&#xff1a; 按一下&#xff0c;小液晶显示的温度是所设定的供暖温度&#xff1b; 按二下&#xff0c;小液晶显示的温度是所设定的生活热水温度&#xff1b; 按三下&#xff0c;小液晶显示的温度是所设定的室内温度&#xff1b; 如果忘记按几下的…

HCIE冲刺-----------论述解析

X园区 1.防火墙放行OSPF 2.trunk口阻塞vlan1 3.关闭VPN防环 4.ospf不通检查NSSA区域配置 5.重定向可以在三层口或二层口配置 6.vlan60在ospf的相关配置 Z园区 1.mpls不通检查lo0口配置 2.isis不通检查接口IP与lldp连接 3.确认同级RR还是备份RR 4.确认策略矩阵的访问 python 1…

测试架构师要正直诚实而非率真

目录 正直诚实的重要性 为何需要正直诚实而非仅是率真 如何实践 正直不得罪人的方式 这里是一些关键的问题&#xff0c;在你感觉要“绝对诚实”地表达时考虑 率真这里有若干问题要考虑&#xff1a; 测试架构师作为软件开发团队中的关键角色之一&#xff0c;需要具备多种专…

Python编码系列—Python SQL与NoSQL数据库交互:深入探索与实战应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

极狐GitLab 多行命令的 CI 日志管理体验的改进

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…

Python中15个递归函数经典案例解析

文末赠免费精品编程资料~~ 递归是Python编程中一个强大的工具&#xff0c;它允许函数调用自身以解决复杂问题。在本文中&#xff0c;我们将探索15个递归函数的经典案例&#xff0c;从基础到进阶&#xff0c;帮助你理解和掌握递归编程。 1. 阶乘计算 阶乘是一个常见的递归应用…

CSP-CCF 202109-1 数组推导

一、问题描述 二、解答 初版&#xff1a; 只得了60分 #include<iostream> using namespace std; int main() {int n;cin >> n;int B[101] { 0 };int sum_max 0;int sum_min0;//以防错误“使用未初始化的局部变量”&#xff0c;建议所有变量都要初始化&#xf…

2024 Google 开发者大会,沉浸式体验AI社会公益

文章目录 一、现场打卡二、AI 社会公益三、Gemma 模型四、Gemini 模型五、Google Cloud六、现场体验七、带着问题逛展八、学习资源和活动九、结束 Happy Hour 一、现场打卡 大家好&#xff0c;我是小雨。 2024 Google 开发者大会&#xff0c;沉浸式体验AI社会公益 今天我们参加…

ERD Online即将突破 4500 用户的喜悦与展望

亲爱的朋友们&#xff1a; 大家好&#xff01; 今天&#xff0c;我怀着无比激动的心情&#xff0c;要与大家分享一个令人振奋的消息&#xff1a;我们的网站用户即将突破 4500 大关&#xff01; 这一路走来&#xff0c;充满了挑战与艰辛&#xff0c;但每一次的困难都成为了我们前…

2024新型数字政府综合解决方案(十)

新型数字政府综合解决方案融合先进的人工智能、大数据、区块链及云计算技术&#xff0c;旨在通过数据共享、智能分析与自动化处理&#xff0c;打造高效、透明、安全的政务环境&#xff0c;优化服务流程&#xff0c;提升决策科学性&#xff0c;加强信息安全&#xff0c;实现政府…

java入门-成员内部类和静态内部类的访问

&#xff08;一&#xff09;成员内部类 package InnerClass;import javax.print.attribute.standard.MediaSize;public class Outer {//2外部类中的成员private int age99;public static String a;public class Inner{//普通的成员内部类//1.1成员变量public String name;priva…

删除镜像报子镜像依赖错误

1、删除镜像报子镜像依赖错误 出现这个错误的原因是因为有其他镜像依赖需要删除的镜像。 2解决方法 2.1首先查看无法删除的镜像被哪些镜像所依赖 docker image inspect --format{{.RepoTags}} {{.Id}} {{.Parent}} $(docker image ls -q --filter since${image_id}) # ${ima…

数据结构:线性结构之顺序表、链表篇

数据结构&#xff1a;顺序表、链表篇 线性表一、顺序表&#xff08;一&#xff09;顺序表的结构定义&#xff08;二&#xff09;顺序表的功能实现1、初始化2、销毁3、扩容4、插入5、删除 &#xff08;三&#xff09;顺序表例题分析1、删除有序数组中的重复项2、合并两个有序数组…