文章

28

粉丝

0

获赞

1

访问

1.6k

头像
2014年(408)计算机学科专业基础综合试题 - 第41题回答
数据结构
发布于2026年5月8日 15:25
阅读数 7


评分及理由

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

学生给出的算法基本设计思想描述为“将二叉树的结点一层一层的存入队列之中,然后遍历树的每一层,当遇到结点为叶结点时,用其权值乘以该结点所在高度减1得到该叶结点的wps,将所有叶结点的wps相加得到总wps”。这个思路本质上是基于层次遍历(广度优先遍历)来计算WPL,与标准答案中的层次遍历方法一致,核心逻辑正确。但存在两个小问题:① 描述中“高度减1”用词不够精确,应为“深度(层数)”,没有明确根结点深度为0;② 将WPL误写为“wps”,这是明显的笔误或识别错误(根据禁止扣分规则,判断为误写不扣分)。整体设计思想正确,得3分。

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

学生在代码中没有单独给出二叉树结点的数据类型定义,而是直接在函数中使用“BiTree”类型。根据题目要求第(2)问是“给出二叉树结点的数据类型定义”,标准答案中定义了:
typedef struct BiTNode{
  int weight;
  struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
而学生作答中没有提供这个定义。虽然学生在函数中使用的是“BiTree”类型,但缺少了必要的类型定义部分,属于不完整回答。因此,第(2)问不得分,扣4分。

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

学生的代码实现有多个逻辑错误:
① 变量声明和初始化错误:代码中“int last = level = 0, rear = front = -1, wps = 0;”语法错误,C语言中不允许在声明时连续赋值,应分别初始化。这属于语法错误,导致代码不可运行。
② 叶子结点判定逻辑错误:代码中“if(p->lchild == NULL && p->rchild == NULL)”放在“if(p->rchild){}”之后,但在叶子结点判定条件内部又嵌套了“if(front == last){ level++; last = rear; }”,这个层次控制逻辑是错误的。标准答案中,层次更新的判断应该对所有结点(无论是否为叶子)执行,而这里只对叶子结点执行,导致非叶子结点不会触发层数更新,从而层数计算错误。
③ 层数更新和计算错误:代码中每次遇到叶子结点时,如果front==last才更新level...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发