路径总和(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)
- 边界处理:若根节点为空,直接返回
false。 - 初始化队列:将根节点入队,初始累加值为根节点的值。
- 层序遍历:
- 从队列头部取出节点,记录当前路径累加值和对应的二叉树节点。
- 若当前节点是叶子节点(左右子树均为空),判断累加值是否等于
sum,是则返回true。 - 若存在左子树,计算新累加值(当前值 + 左子节点值),并将左子节点入队。
- 若存在右子树,计算新累加值(当前值 + 右子节点值),并将右子节点入队。
- 移除队列头部节点,继续遍历,直到队列为空。
- 遍历结束:若未找到符合条件的路径,返回
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. 结论
该代码通过广度优先搜索(层序遍历)实现了路径和判断功能,逻辑清晰,能正确处理各种边界情况和常规测试用例,符合题目要求。
