文章
35
粉丝
0
获赞
0
访问
1.6k
评分及理由
(1)得分及理由(满分3分)
学生答案的基本设计思想是使用后序遍历,向上层传递子树的最小值和最大值(即数组{min, max}),并利用这些信息判断当前结点是否满足条件。该思路与标准答案中的最优解一致,利用了二叉搜索树的性质,通过后序遍历维护子树的最小值和最大值,从而避免重复遍历。思路描述清晰,符合题目要求。得3分。
(2)得分及理由(满分9分)
学生代码实现了后序遍历,并尝试维护子树的最小值和最大值,但在关键逻辑上存在错误:
if(val + val == l[1] + r[0])
有误。正确条件应为计算左子树的最大值与当前结点值的差(即val - l[1]
)和右子树的最小值与当前结点值的差(即r[0] - val
),并比较这两个差是否相等。学生代码直接比较2*val
和l[1] + r[0]
,这是数学错误,会导致判断失效。int * l = dfs(root->left), r = dfs(root->right);
应为int *l = dfs(root->left), *r = dfs(root->right);
(缺少*
);return {0, 0};
在C语言中非法,应返回具体数组或指针;内存分配未释放可能导致泄漏。{0,0}
,且0可能与实际结点值冲突(结点值均为正数,但0不是正数)。尽管整体思路正确,但关键判断逻辑错误和语法问题导致代码无法正确运行。根据标准答案,最优解代码满分9分,但因此处有严重逻辑错误,扣5分;语法错误扣2分;边界处理不完善扣1分。得1分。
(3)得分及理由(满分2分)
学生正确指出时间复杂度为O(n),与最优解一致。得2分。
题目总分:3+1+2=6分
登录后发布评论
暂无评论,来抢沙发