当前位置: 首页 > news >正文

路径总和(C)

一、题目内容

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

叶子节点 是指没有子节点的节点。

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。

示例 2:

输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。

示例 3:

输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。

二、源代码(部分)

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
typedef struct queNode {int val;struct TreeNode *node;struct queNode *next;
} queNode;void init(struct queNode **p, int val, struct TreeNode *node) {(*p) = (struct queNode *)malloc(sizeof(struct queNode));(*p)->val = val;(*p)->node = node;(*p)->next = NULL;
}bool hasPathSum(struct TreeNode *root, int sum) {if (root == NULL) {return false;}struct queNode *queLeft, *queRight;init(&queLeft, root->val, root);queRight = queLeft;while (queLeft != NULL) {struct TreeNode *now = queLeft->node;int temp = queLeft->val;if (now->left == NULL && now->right == NULL) {if (temp == sum) return true;}if (now->left != NULL) {init(&queRight->next, now->left->val + temp, now->left);queRight = queRight->next;}if (now->right != NULL) {init(&queRight->next, now->right->val + temp, now->right);queRight = queRight->next;}queLeft = queLeft->next;}return false;
}

三、题目解析

1. 数据结构定义
  • 二叉树节点(TreeNode:包含节点值(val)、左子树指针(left)、右子树指针(right)。
  • 队列节点(queNode:用于层序遍历的辅助队列,存储当前路径的累加值(val)、对应的二叉树节点(node)、下一个队列节点指针(next)。
2. 核心函数解析
  • init 函数:初始化队列节点,为其分配内存并设置初始值(累加值、对应二叉树节点、指针置空)。
  • hasPathSum 函数:判断二叉树中是否存在从根节点到叶子节点的路径,其路径上所有节点值之和等于目标 sum
3. 算法逻辑(广度优先搜索 BFS)
  1. 边界处理:若根节点为空,直接返回 false
  2. 初始化队列:将根节点入队,初始累加值为根节点的值。
  3. 层序遍历
    • 从队列头部取出节点,记录当前路径累加值和对应的二叉树节点。
    • 若当前节点是叶子节点(左右子树均为空),判断累加值是否等于 sum,是则返回 true
    • 若存在左子树,计算新累加值(当前值 + 左子节点值),并将左子节点入队。
    • 若存在右子树,计算新累加值(当前值 + 右子节点值),并将右子节点入队。
    • 移除队列头部节点,继续遍历,直到队列为空。
  4. 遍历结束:若未找到符合条件的路径,返回 false

四、实验总结

1. 功能验证
  • 测试用例 1:空树 → 返回 false(正确,空树无路径)。
  • 测试用例 2:单节点树(值为 5,目标 sum=5)→ 返回 true(正确,根节点即叶子节点)。
  • 测试用例 3:多节点树(如 root = [5,4,8,11,null,13,4,7,2,null,null,null,1],sum=22)→ 存在路径 5→4→11→2(和为 22),返回 true(正确)。
  • 测试用例 4:路径和不匹配 → 返回 false(正确)。
2. 算法特性
  • 时间复杂度:O (n),其中 n 为二叉树节点数。每个节点入队和出队各一次,遍历所有节点。
  • 空间复杂度:O (n),队列最坏情况下存储所有叶子节点(平衡树约 n/2,斜树为 1)。
  • 优势:使用 BFS 可在找到符合条件的路径后立即返回,无需遍历所有节点(提前终止)。
  • 局限:需要额外队列存储节点信息,空间开销略高于递归(DFS)实现。
3. 改进建议
  • 内存管理:代码中未释放队列节点的动态内存,长期运行可能导致内存泄漏,可在出队时添加 free 操作。
  • 代码简化:可使用结构体数组或动态数组替代链表实现队列,减少指针操作的复杂度。
4. 结论

该代码通过广度优先搜索(层序遍历)实现了路径和判断功能,逻辑清晰,能正确处理各种边界情况和常规测试用例,符合题目要求。

http://www.dtcms.com/a/590433.html

相关文章:

  • 网站模版怎么样网站内容一样影响收录
  • 网站开发怎么接入支付宝中山企业网站的建设
  • 做网站参考文献河北网站建设价格低
  • 天河建设网站报价网页打不开qq可以上qq
  • 郑州网站推广电话wordpress发布文章 自定义栏目
  • 深圳市住房和城乡建设局网站首页静态网站建设背景
  • 做编程的网站有哪些大航母网站建设案例
  • 青岛制作企业网站百度信誉任何在网站展示
  • 深入浅出 Ascend C:新一代算子开发接口 Aclnn 原理解析与实践
  • 山西省洪涝灾害应急物资体系优化研究 - 核心章节建模与算法实施方案
  • 做生物学的网站平板室内装修设计软件
  • 为什么要建设个人网站网站建设优惠活动
  • 八.Docker-compose容器编排-生产环境用Kubernetes替代
  • ComfyUI高级应用之图片放大
  • 编程的网站免费外链网站
  • 网站开发的经费预算免费发布信息网站平台
  • 郑州那个公司做网站好福州自助建站
  • 昆山建设银行交学费的网站公众号推文模板
  • 河南企业网站优化电商网站设计企业
  • python 根据坐标将图片进行裁图
  • 四川省安监站网址安庆网站建设推荐秒搜科技
  • 烟台网站建设的方法有哪些wordpress主播主题
  • 网站集约化建设讲话稿网页设计图片位置怎么设置
  • 清远住房和城乡建设部网站wordpress权限ip
  • 矢量网站动画怎么做崇卅市网站建设
  • xiyuetaCMS 网站前台在线修改功能:让内容管理变得简单快捷
  • 基于微调模型兜底的RAG系统:错误检测与召回率评估
  • 做网站的如何说服客户网站制作公司合肥
  • RHCSA作业3
  • 网站建设用免费素材如何做好网站推