2020年计算机学科专业基础综合试题 - 第42题回答
数据结构
发布于2025年7月8日 18:20
阅读数 39
(1)使用二叉树保存,编码对应从根节点开始走到某一叶节点的路径
(2)从左到右扫码0/1串中字符,从根节点开始,0表示往左子树走,1表示往右子树走,直到叶节点,输出叶节点中的字符串,然后再从根节点开始重复直到扫描完0/1字符串
(3)
-
初始化: 创建一个二叉树,只有一个根节点(root),且根节点的左子指针和右子指针都为空。这个根节点不代表任何编码,只是起始点。
-
依次处理每个编码 C: 循环读取每个待检测的编码。
-
构建/寻找对应路径 (逐位处理编码): 对于当前编码 C 的每一位 (从左到右):
- 从根结点开始: 当前位置为二叉树的根节点。
- 根据编码位 (0 或 1) 移动指针:
- 如果编码位是 0,则沿左子指针移动。
- 如果编码位是 1,则沿右子指针移动。
- 检查目标结点:
- 情况 ①: 遇到叶子节点 (非根节点): 如果当前指针指向一个叶子节点(即,这个节点没有子节点),这意味着您在尝试添加一个编码 C 的时候,路径经过了另一个编码的“终点”。 这说明当前编码 C 是先前编码的一个前缀,这违反了前缀特性。 立即返回 “不具有前缀特性”。例如在构建了 0, 10 后遇到编码 01,构建0的时候到达了叶子节点。
- 情况 ②: 在C的扫描过程中,均没创建新节点: 如果对于整个C,都没有创建新节点(即,完全沿着已存在的现有路径走),这表示编码 C 是先前编码的子集。 例如,之前添加了 10, 此时的编码是 1。 这个时候,在二叉树中,找到 1 后,发现这是一个 叶子节点。 这意味着 C 是前一个编码的前缀。
- 到达终点并且新建结点: 如果到达了C的最后一个字符,且创建了新的结点。说明这个编码之前没有出现过,且不是另一个编码的前缀。此时就可以继续处理下一个编码了。
评分及理由
(1)得分及理由(满分4分)
得分:4分
理由:学生明确指出了使用二叉树来保存具有前缀特性的不等长编码,并且描述了编码对应从根节点到叶节点的路径,这与标准答案中的哈夫曼树或前缀无关编码对应的...
登录后发布评论
暂无评论,来抢沙发