文章
317
粉丝
1
获赞
220
访问
82.8k

评分及理由
(1)得分及理由(满分3分)
学生给出的基本设计思想是“对二叉树进行中序遍历,当遇到叶结点时计算当前树高乘该结点权值,并用wpl全局变量计算累和”。这与标准答案中基于先序遍历的思想本质一致,都是通过递归遍历,在访问到叶子结点时累加深度与权值的乘积。虽然学生提到的是“中序遍历”,但核心思想(遍历过程中累加叶子结点的带权路径)是正确的。因此,本部分不扣分。
得分:3分
(2)得分及理由(满分4分)
学生给出的结点数据类型定义为:
struct LNode { struct LNode* left; int weight; struct LNode* right; };
这与标准答案中的typedef struct BiTNode{ int weight; struct BiTNode *lchild, *rchild; }BiTNode, *BiTree;在结构上完全一致,只是成员变量名略有不同(left/right 对比 lchild/rchild),这并不影响数据结构的正确性。定义中包含了左指针、权值和右指针,符合题目要求。因此,本部分不扣分。
得分:4分
(3)得分及理由(满分6分)
学生给出的算法代码整体思路正确,通过递归中序遍历计算WPL。但存在以下问题:
1. 使用了全局变量wpl。在递归函数中依赖全局变量,虽然能得到正确结果,但会导致函数不可重入(即多次调用Cwpl会累加之前的结果)。标准答案中通过static变量或参数传递来避免此问题,但题目并未明确禁止全局变量,且算法逻辑正确,因此此处不视为逻辑错误,但代码的健壮性稍差。考虑到题目主要考察WPL计算的核心逻辑,且学生代码在单次调用下功能正确,此处不扣分。
2. 递归函数中判断叶子结点的条件为if (L->left == NULL && L->right == NULL),这是正确的。
3. 递归终止条件为if (L == NULL) return;,处理了空树情况,正确。
4. 主函数Cwpl调用递归函数并返回结果,逻辑正确。
综合来看,算法实现了WPL的计算,核心逻辑无误。因此,本部分不扣分。
得分:6分
题目总分:3+4+6=13分
登录后发布评论
暂无评论,来抢沙发