文章
28
粉丝
0
获赞
1
访问
1.6k

评分及理由
(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...
登录后发布评论
暂无评论,来抢沙发