文章
70
粉丝
1
获赞
0
访问
11.0k
(1)基本设计思想:采用深度优先遍历二叉树的思想,递归统计每一条可能路径上的节点权值之和,如果sum==k则表示找到有效路径,输出路径上所有节点权值,每次回溯前都会恢复sum的值用于查找下一条可能的有效路径。
(2)
void solution(BiTree T, int k,int*path){
FindValidPaths(T,int k int path,0);
}
int sum=0;
void FindValidPaths(BiTree T,int k,int*path,int pathLen){
if(T==NULL) return;
path[pathLen++]=T->val;//记录当前访问节点权值
sum+=T->val;//加上当前节点权
if(sum==k){
//输入出路径上的节点权值
for(int i=0;i<pathLen;i++){
cout<<path[i]<<endl;
}
return;
}
FindValidPaths(T->lchild,k,path,pathLen);
FindValidPaths(T->rchild,k,path,pathLen);
sum-=T->val;//往上回溯
return;
}
(3)时间复杂度O(n),空间复杂度O(logn),其中n为二叉树的节点个数
评分及理由
(1)得分及理由(满分4分)
学生答案中提到了深度优先遍历(前序遍历)和回溯思想,但未明确说明需要继续遍历子树(即使sum等于k或大于k)以处理负权值的情况,且未提及路径数组的回溯操作(仅通过全局变量sum回溯,但路径长度pathLen未回溯)。设计思想描述不够完整。扣1分。
得分:3分
(2)得分及理由(满分7分)
代码存在以下逻辑错误:
1. 使用全局变量`sum`(共享状态)会导致递归调用间相互干扰(非线程安全),且未在递归调用后正确回溯(虽然代码中有`sum-=T->val`,但若左子树递归后sum值被修改,右...
登录后发布评论
暂无评论,来抢沙发