文章

154

粉丝

0

获赞

3

访问

24.9k

头像
2014年计算机学科专业基础综合试题 - 第41题回答
数据结构
发布于2025年9月18日 17:02
阅读数 7


评分及理由

(1)得分及理由(满分3分)

学生答案的基本设计思想是使用DFS(深度优先搜索,即先序遍历)遍历二叉树,同时传递当前深度(高度)参数,计算每个叶子结点的权值与深度的乘积之和。这与标准答案中基于先序遍历的思想一致,思路正确。因此得3分。

(2)得分及理由(满分4分)

学生给出的结点数据类型定义存在错误:

  • 结构体定义语法错误,缺少结构体名称和类型定义关键字(如应为typedef struct TreeNode { ... } TreeNode;)。
  • 成员weight应直接定义为int weight;,而非通过函数参数初始化(int weight = val;不符合C/C++语法)。
  • 成员leftright应为指针类型(struct TreeNode* left;),但学生答案中未正确声明(缺少*)。

由于数据类型定义存在多处语法和逻辑错误,扣4分。但考虑到可能是识别错误(如误写或漏写),但错误较多且影响基本结构,因此得0分。

(3)得分及理由(满分6分)

学生给出的算法代码整体思路正确:通过递归先序遍历计算WPL,递归函数中累计当前结点的权值与深度的乘积(仅对非空结点),并递归处理左右子树。但存在以下问题:

  • 递归函数中,对非叶子结点也进行了乘积累计(标准答案中仅对叶子结点计算),但数学上等价(因为非叶子结点的权值会被乘以深度,但后续递归中会重复计算?)。实际上,学生代码中所有结点(包括非叶子)都参与了计算,但题目要求仅叶结点的带权路径长度。然而,根据WPL定义(仅叶结点),此算法会错误包含非叶结点的权值(如果非叶结点有权值)。但题目中结点结构显示所有结点都有weight域,但问题描述中明确“叶结点的weight域保存该结点的非负权值”,暗示非叶结点的weight可能无意义或为0?学生算法假设所有结点都有权值,但题目仅要求叶结点有权值,因此可能逻辑错误。
  • 递归基线条件(root == NULL)正确,但递归公式对所有结点计算root->weight * height,这与WPL定义不符(应仅叶结点)。

扣分理由:逻辑错误(错误地计算了非叶结点的贡献),但考虑到题目中非叶结点的weight可能为0(未明确说明),但严格按定义应只处理叶结点。因此扣3分(主要逻辑错误)。此外,代码中高度起始值为1(根深度为1)正确,递归...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发