PTA (哈夫曼树) 修理牧场 分数 15 作者 DS课程组 单位 浙江大学

文章描述了一个农夫修理栅栏的问题,需要将木头锯成N块,以最小化总花费。给出了一个基于小根堆和哈夫曼树的算法来计算最少花费,涉及输入木头长度和锯木费用计算。

农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数Li​个长度单位,于是他购买了一条很长的、能锯成N块的木头,即该木头的长度是Li​的总和。

但是农夫自己没有锯子,请人锯木的酬金跟这段木头的长度成正比。为简单起见,不妨就设酬金等于所锯木头的长度。例如,要将长度为20的木头锯成长度为8、7和5的三段,第一次锯木头花费20,将木头锯成12和8;第二次锯木头花费12,将长度为12的木头锯成7和5,总花费为32。如果第一次将木头锯成15和5,则第二次锯木头花费15,总花费为35(大于32)。

请编写程序帮助农夫计算将木头锯成N块的最少花费。

输入格式:

输入首先给出正整数N(≤104),表示要将木头锯成N块。第二行给出N个正整数(≤50),表示每段木块的长度。

输出格式:

输出一个整数,即将木头锯成N块的最少花费。

输入样例:

8
4 5 1 2 1 3 1 1

输出样例:

49

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

 本题因为不需要遍历哈夫曼树因此可以不用构建哈夫曼树。以下为构建和遍历哈夫曼树的代码,用到自定义小根堆(小顶堆)优先队列

ACcode:

#include<iostream>
#include<queue>
using namespace std;

struct TreeNode {
    int data;
    TreeNode* lchild;
    TreeNode* rchild;
};

// 定义比较类  
stru
分数 2 作者 DS课程 单位 浙江大学 任何二叉搜索中同一层的结点从左到右是有序的(从小到大)。 T F 分数 2 作者 DS课程 单位 浙江大学 一棵有124个结点的完全二叉,其叶结点个数是确定的。 T F 分数 2 作者 DS课程 单位 浙江大学 对于一个有N个结点、K条边的森林,不能确定它共有几棵。 T F 分数 2 作者 DS课程 单位 浙江大学 二叉搜索的查找和折半查找的时间复杂度相同。 T F 分数 2 作者 DS课程 单位 浙江大学 若一个结点是某二叉的中序遍历序列的最后一个结点,则它必是该的前序遍历序列中的最后一个结点。 T F 分数 2 作者 DS课程 单位 浙江大学 某二叉的后序和中序遍历序列正好一样,则该二叉中的任何结点一定都无右孩子。 T F 分数 2 作者 DS课程 单位 浙江大学 某二叉的前序和中序遍历序列正好一样,则该二叉中的任何结点一定都无右孩子。 T F 分数 2 作者 DS课程 单位 浙江大学 某二叉的后序和中序遍历序列正好一样,则该二叉中的任何结点一定都无左孩子。 T F 分数 2 作者 何钦铭 单位 浙江大学 将一棵完全二叉存于数中(根结点的下标为1)。则下标为23和24的两个结点是兄弟。 T F 分数 2 作者 陈越 单位 浙江大学 若A和B都是一棵二叉的叶子结点,则存在这样的二叉,其前序遍历序列为...A...B...,而中序遍历序列为...B...A...。 T F 分数 1 作者 陈越 单位 浙江大学 对AVL中的任一结点,其右子的高度一定比其左子的高度要高。 T F 分数 2 作者 徐镜春 单位 浙江大学 若一棵平衡二叉的所有非叶结点的平衡因子都是0,则其必为完美二叉。 T F 分数 1 作者 李祥 单位 湖北经济学院 二叉不是的特殊情况(即度为 2 的)。 T F 分数 5 作者 杨红梅 单位 山东科技大学 最佳二叉是AVL(平衡二叉)。 T F 分数 5 作者 杨红梅 单位 山东科技大学 在查找(二叉排序)中插入一个新结点,总是插入到叶结点下面。 T F 分数 5 作者 杨红梅 单位 山东科技大学 N个结点的二叉排序有多种,其中高最小的二叉排序是最佳的。 T F 分数 1 作者 李廷元 单位 中国民用航空飞行学院 完全二叉中,若一个结点没有左孩子,则它必是叶。 T F 分数 1 作者 李廷元 单位 中国民用航空飞行学院 完全二叉的存储结构通常采用顺序存储结构。 T F 分数 1 作者 DS课程 单位 临沂大学 二叉可以用二叉链表存储,无法用二叉链表存储。 T F 分数 1 作者 DS课程 单位 临沂大学 二叉中序线索化后,不存在空指针域。 T F 分数 2 作者 徐镜春 单位 浙江大学 哈夫曼编码是一种最优的前缀码。对一个给定的字符集及其字符频率,其哈夫曼编码不一定是唯一的,但是每个字符的哈夫曼码的长度一定是唯一的。 T F 分数 1 作者 王东 单位 贵州师范学院 平衡二叉中,若某个结点的左、右孩子的平衡因子为零,则该结点的平衡因子一定为零。 T F 分数 1 作者 王东 单位 贵州师范学院 完全二叉的前序序列中,若结点u在结点v之前,则u一定是v的祖先。 T F 分数 1 作者 王东 单位 贵州师范学院 二叉按某种顺序线索化后,任一结点均有指向其前驱和后继的线索。 T F 分数 1 作者 王东 单位 贵州师范学院 在中序线索二叉中,每一非空的线索均指向其祖先结点。 T F 分数 1 作者 YJ 单位 西南石油大学 给定一棵,可以找到唯一的一棵二叉与之对应。 T F 分数 1 作者 YJ 单位 西南石油大学 形结构中元素之间存在一个对多个的关系。 T F 分数 1 作者 YJ 单位 西南石油大学 度为二的就是二叉。 T F 分数 1 作者 YJ 单位 西南石油大学 哈夫曼是带权路径长度最短的,路径上权值较大的结点离根较近。 T F 分数 1 作者 ZXM 单位 西南石油大学 二叉就是度为二的有序。 T F 分数 1 作者 李祥 单位 湖北经济学院 关于哈夫曼 哈夫曼中一定没有度为 1 的结点。 T F 分数 1 作者 李祥 单位 湖北经济学院 哈夫曼一定是完全二叉。 T F 分数 1 作者 李祥 单位 湖北经济学院 一棵非空二叉,若先序遍历与中序遍历的序列相同,则该二叉所有结点均无左孩子。 T F 分数 1 作者 李祥 单位 湖北经济学院 非空二叉的形态 一棵非空二叉,若先序遍历与后序遍历的序列相反,则该二叉所有结点均无左孩子。 T F 分数 1 作者 李祥 单位 湖北经济学院 非空二叉的形态 一棵非空二叉,若先序遍历与后序遍历的序列相反,则该二叉所有结点均无右孩子。 T F 分数 1
最新发布
10-24
题目重述 判断下列关于二叉、搜索、完全二叉哈夫曼等性质的陈述是否正确(T/F)。 --- **1. 任何二叉搜索中同一层的结点从左到右是有序的(从小到大)。** F 详解:二叉搜索的性质是左子 < 根 < 右子,但同一层的结点之间没有直接大小顺序保证。例如根的右子中的左孩子可能小于根的左子中的右孩子,因此同层从左到右不一定有序。 --- **2. 一棵有124个结点的完全二叉,其叶结点个数是确定的。** T 详解:完全二叉的结构由结点数唯一确定。对于 $n=124$,可计算出最后一层的结点分布,从而确定叶子结点个数为 $\left\lceil \frac{n}{2} \right\rceil = 62$。 --- **3. 对于一个有N个结点、K条边的森林,不能确定它共有几棵。** F 详解:森林中的棵数为 $N - K$。每棵满足“边数 = 结点数 - 1”,故总边数 $K = N - T$,解得 $T = N - K$,是确定的。 --- **4. 二叉搜索的查找和折半查找的时间复杂度相同。** F 详解:折半查找时间复杂度为 $O(\log n)$;而普通二叉搜索在最坏情况下退化为链表,查找为 $O(n)$,仅平衡才能达到 $O(\log n)$。 --- **5. 若一个结点是某二叉的中序遍历序列的最后一个结点,则它必是该的前序遍历序列中的最后一个结点。** F 详解:中序最后一个是右子最右路径的末端,而前序最后一个不一定是该结点(如右偏中前序最后可能是叶子),二者无必然联系。 --- **6. 某二叉的后序和中序遍历序列正好一样,则该二叉中的任何结点一定都无右孩子。** T 详解:后序是左右根,中序是左根右。若两者相同,则每个结点都不能有右子,否则顺序不同。因此所有结点无右孩子。 --- **7. 某二叉的前序和中序遍历序列正好一样,则该二叉中的任何结点一定都无右孩子。** F 详解:前序是根左右,中序是左根右。若相同,则必须无左孩子(否则中序先访问左),而非无右孩子。此时应为所有结点无左孩子。 --- **8. 某二叉的后序和中序遍历序列正好一样,则该二叉中的任何结点一定都无左孩子。** F 详解:同第6题分析,应是无右孩子。若有左孩子,只要无右孩子仍可满足后序与中序一致。所以错误在于“无左孩子”。 --- **9. 将一棵完全二叉存于数中(根结点的下标为1)。则下标为23和24的两个结点是兄弟。** T 详解:在完全二叉中,结点 $i$ 的父节点为 $\left\lfloor \frac{i}{2} \right\rfloor$。23 和 24 的父节点都是 11($23/2=11.5→11$,$24/2=12→12$?错!应为 $23//2=11$,$24//2=12$,父节点分别为11和12),不是同一个,故 **不是兄弟** → 正确答案为 **F** 更正: $\left\lfloor \frac{23}{2} \right\rfloor = 11$,$\left\lfloor \frac{24}{2} \right\rfloor = 12$,父节点不同,不是兄弟。 所以原判断错误,应为 **F** --- **10. 若A和B都是一棵二叉的叶子结点,则存在这样的二叉,其前序遍历序列为...A...B...,而中序遍历序列为...B...A...。** T 详解:可以构造:让 A 是某个子的根(虽为叶),B 在其左侧。例如 A 为根,B 在左子中某位置,但需均为叶。可通过设计使前序先 A 后 B,中序先 B 后 A。 实际反例思考:若 A 是整棵的根,且是叶子 ⇒ 整棵只有一个结点,不可能有 B。 但如果 A 不是根,B 是 A 左子中的结点,则前序先访问祖先再到 A 再到 B?不行。 深入分析:前序是“根左右”,中序是“左根右”。若前序中 A 在 B 前,说明 A 比 B 更早被访问。 若中序中 B 在 A 前,说明 B 在 A 的左边。 这是可能的:设 A 是某个右孩子,B 是其左后代。但 A、B 都是叶子。 举例: ``` C / \ B A ``` 前序:C → B → A 中序:B → C → A 不符合 B...A 在中序,且 A 在前序在 B 后。 要找前序: ...A...B..., 中序: ...B...A... 比如: ``` D / \ A E / B ``` 前序:D→A→B→E,即 A 在 B 前 中序:B→A→D→E,B 在 A 前 → 符合条件,A、B 都是叶子?否,A 不是叶子。 修改:让 A 和 B 都是叶子: ``` D / \ C E / A \ B ``` 还是 A 不是叶子。 最终构造:不可行。因为如果 A 出现在前序中在 B 之前,意味着 A 所在子先于 B 被访问;若中序中 B 在 A 前,B 必须在 A 左侧或祖先左子中。但若 A、B 都是叶子,且无共同路径冲突,理论上可构造。 实际上标准结论是:**存在这样的情况**。答案为 **T** 接受命题成立 → **T** --- **11. 对AVL中的任一结点,其右子的高度一定比其左子的高度要高。** F 详解:AVL要求平衡因子 ∈ {-1, 0, 1},并不规定哪边更高。右子可以矮、等高或高。 --- **12. 若一棵平衡二叉的所有非叶结点的平衡因子都是0,则其必为完美二叉。** T 详解:平衡因子为0 ⇒ 左右子高度相等。递归下去,每一层都满,最终形成完美二叉(所有叶在同一层且全满)。 --- **13. 二叉不是的特殊情况(即度为 2 的)。** T 详解:二叉是有序,区分左右;而普通的“度为2的”无序,且定义不同。二者结构含义不同。 --- **14. 最佳二叉是AVL(平衡二叉)。** F 详解:“最佳二叉”通常指带权路径长度最小的哈夫曼,用于编码效率最优,而非 AVL (用于搜索平衡)。 --- **15. 在查找(二叉排序)中插入一个新结点,总是插入到叶结点下面。** T 详解:BST 插入时从根开始比较,直到找到空位置,该位置必然是某个叶子的左或右空指针处,因此新结点成为新的叶子。 --- **16. N个结点的二叉排序有多种,其中高最小的二叉排序是最佳的。** T 详解:高最小 ⇒ 查找效率最高(接近 $O(\log n)$),是最优的二叉排序形态,常通过构造平衡实现。 --- **17. 完全二叉中,若一个结点没有左孩子,则它必是叶。** T 详解:完全二叉按层填充。若某结点无左孩子 ⇒ 其本身已是最后一个非叶结点之后的结点,且不会有右孩子 ⇒ 是叶子。 --- **18. 完全二叉的存储结构通常采用顺序存储结构。** T 详解:完全二叉适合用数存储(无浪费空间),父子关系可通过下标计算,高效简洁。 --- **19. 二叉可以用二叉链表存储,无法用二叉链表存储。** F 详解:可用“孩子兄弟表示法”转化为二叉链表存储:左指针指向第一个孩子,右指针指向下一个兄弟。 --- **20. 二叉中序线索化后,不存在空指针域。** F 详解:中序线索化将空指针改为前驱/后继线索,但根节点的前驱线索和最后一个结点的后继线索仍为空(或指向头结点),并非全部消除空指针。 --- **21. 哈夫曼编码是一种最优的前缀码。对一个给定的字符集及其字符频率,其哈夫曼编码不一定是唯一的,但是每个字符的哈夫曼码的长度一定是唯一的。** F 详解:虽然哈夫曼编码不一定唯一(合并顺序不同),但**码长也不一定唯一**。不同构造方式可能导致同一字符有不同的深度(码长),只要总WPL最小即可。 --- **22. 平衡二叉中,若某个结点的左、右孩子的平衡因子为零,则该结点的平衡因子一定为零。** F 详解:左右子高度相等才使平衡因子为0。即使孩子平衡因子为0,不代表它们高度相等。例如左孩子高度2,右孩子高度3,即使各自平衡,根的平衡因子为-1。 --- **23. 完全二叉的前序序列中,若结点u在结点v之前,则u一定是v的祖先。** F 详解:前序是根左右,u 在 v 前只说明 u 更早被访问,并不一定是祖先。例如 u 是左子末尾,v 是右子开头,u 不是 v 祖先。 --- **24. 二叉按某种顺序线索化后,任一结点均有指向其前驱和后继的线索。** F 详解:在线索二叉中,首个结点无前驱,最后一个结点无后继,对应指针为空或特殊标记,不能保证都有前驱和后继线索。 --- **25. 在中序线索二叉中,每一非空的线索均指向其祖先结点。** F 详解:中序线索中,前驱是左子中最右结点,后继是右子中最左结点,这些不一定是祖先,也可能是子孙。 --- **26. 给定一棵,可以找到唯一的一棵二叉与之对应。** T 详解:通过“左孩子右兄弟”法转换,任意可唯一映射为二叉,且此变换是一一对应的。 --- **27. 形结构中元素之间存在一个对多个的关系。** T 详解:中一个父结点可有多个子结点,体现“一对多”关系,符合的基本特性。 --- **28. 度为二的就是二叉。** F 详解:度为2的是指最多有一个结点有两个孩子,且不区分左右;而二叉是有序的,左右分明,概念不同。 --- **29. 二叉就是度为二的有序。** F 详解:二叉允许度小于2,且强调每个结点有左右之分的结构,不同于“度为二的有序”的限制。 --- **30. 哈夫曼是带权路径长度最短的,路径上权值较大的结点离根较近。** T 详解:哈夫曼的目标是最小化 WPL,构造时高频(权大)字符靠近根,低频远离根,提升整体效率。 --- **31. 哈夫曼中一定没有度为 1 的结点。** T 详解:哈夫曼由两两合并构造,每次生成新内部结点都有两个孩子,故内部结点度为2,叶子度为0,无度为1的结点。 --- **32. 哈夫曼一定是完全二叉。** F 详解:哈夫曼不一定完全填满最后一层,也不一定按层顺序排列,故不一定是完全二叉。 --- **33. 一棵非空二叉,若先序遍历与中序遍历的序列相同,则该二叉所有结点均无左孩子。** T 详解:先序是根左右,中序是左根右。若相同 ⇒ 无左子干扰,即所有结点无左孩子。 --- **34. 一棵非空二叉,若先序遍历与后序遍历的序列相反,则该二叉所有结点均无左孩子。** F 详解:先序:根左右;后序:左右根。若互为逆序 ⇒ 结构极端不对称。事实上只有当为单链(如全右)时可能。但“均无左孩子”未必成立。反例如仅有右孩子链时成立,但“均无左孩子”不能推出逆序。此命题逻辑不充分。 进一步分析:若所有结点无左孩子 ⇒ 先序:根→右;后序:右→根 ⇒ 后序是先序的逆吗?否。例如三个结点:A→B→C(右链) 先序:A,B,C 后序:C,B,A → 是逆序 → 成立。 反之若先序与后序互逆 ⇒ 是否必须无左孩子?是的。否则结构不对称会导致中间部分无法反转匹配。 但选项说“所有结点均无左孩子”是对的。然而下一题又说“无右孩子”也类似。 看第35题: **35. 一棵非空二叉,若先序遍历与后序遍历的序列相反,则该二叉所有结点均无右孩子。** F 同理,若全为左链,先序:A,B,C;后序:C,B,A → 也是逆序。所以两种情况都满足。 因此既可能全无右孩子,也可能全无左孩子。 但题目断言“一定都无右孩子”或“一定都无左孩子”都不全面。 然而题目给出的是两个独立判断。 关键:若先序与后序互为逆序,则必须是“退化成链”的形式,且只能有一个方向。 若既有左又有右,则中序部分会破坏逆序性。 结论:必须是单向链(要么全左,要么全右) 所以: - 若断言“一定都无左孩子” → 错,因为也可能是无右孩子的情况 - 若断言“一定都无右孩子” → 同样错 因此 **34题 F,35题 F** 但原题 34 和 35 分别问两种情况: > 34. ……则该二叉所有结点均无左孩子。 → F(不一定,也可能无右孩子) > > 35. ……则该二叉所有结点均无右孩子。 → F(同理) 所以两者都为 **F** --- ### 知识点 - **二叉搜索性质**:左子 < 根 < 右子,不保证同层有序。 - **完全二叉结构特性**:结点数决定形状,叶子数确定,适合顺序存储。 - **遍历序列关系**:前序与中序相同 ⇒ 无左孩子;后序与中序相同 ⇒ 无右孩子。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值