文章

70

粉丝

1

获赞

0

访问

11.0k

头像
2025 年 7 月第 1 次 408 月考试卷 - 第41题回答
数据结构
发布于2025年9月20日 17:21
阅读数 63

(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值被修改,右...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发