文章
7
粉丝
0
获赞
0
访问
560
评分及理由
(1)得分及理由(满分3分)
学生答案中描述了对树进行先序遍历,判断是否存在左右子树,然后寻找左子树最右结点和右子树最左结点,并计算差值进行比较。这与标准答案中的"次优解"设计思想基本一致,利用了二叉搜索树的性质。但描述中"算左右中最大的值不大于左子树最右边的值与右子树最左边的值相减"存在表述不清,且"最大的值"可能为误写(应为"最小距离")。总体思路正确,但表述有缺陷。扣1分,得2分。
(2)得分及理由(满分9分)
学生代码实现存在多处错误:
1. 变量声明错误:`TreeNode* r, l;` 应为 `TreeNode *r, *l;`(l应为指针类型)。
2. 使用`data`字段而非`val`:题目定义结点使用`val`字段,代码中误写为`data`。
3. 循环条件错误:`while (l->right != NULL || r->left != NULL)` 会导致空指针访问(当l->right为NULL但r->left非NULL时,l会被赋值为NULL,后续访问l->data会出错)。正确应分别循环查找最右和最左结点。
4. 递归调用错误:在条件分支中错误地递归调用`countNodes`(应遍历所有结点,而非仅当条件不满足时递归)。
5. 初始化和返回值问题:变量n未初始化,且递归未覆盖所有结点(缺少对左/右子树的递归调用)。
6. 条件判断逻辑错误:`if (a + b == 0 || a + b == 2 * a)` 数学等价于`a==0或b==a`,但实际需要比较的是`|a|`和`|b|`是否相等(注意a和b可能是负数?但这里a=root->val - l->val≥0,b=r->val - root->val≥0,所以实际应直接比较a和b是否相等)。
代码整体逻辑与标准答案"次优解"相似,但实现存在严重缺陷,无法正确运行。根据错误数量扣分:变量声明错误扣1分,字段名错误扣1分,循环条件错误扣2分,递归逻辑错误扣2分,条件判断错误扣1分,未初始化扣1分。得1分(仅因思路正确保留基础分)。
(3)得分及理由(满分2分)
学生回答时间复杂度为O(n),但实际算法应为O(nh)(h为树高),因为每个结点需要沿子树查找最左/最右结点(耗时O(h))。空间复杂度O(n)正确(递归栈深度)。时间复杂度分析错误,扣1分,得1分。...
登录后发布评论
暂无评论,来抢沙发