持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
力扣112. 路径总和
一、题目描述:
给你二叉树的根节点 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
解释:由于树是空的,所以不存在根节点到叶子节点的路径。
提示:
树中节点的数目在范围 [0, 5000] 内
-1000 <= Node.val <= 1000
-1000 <= targetSum <= 1000
来源:力扣(LeetCode) 链接:leetcode.cn/problems/pa… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
-
这道题考察了什么思想?你的思路是什么?
这道题目本质上就是二叉树的遍历,不过需要在遍历时对路径进行求和,需要防止重复计算。
我们需要先判断根节点是否为空,如果为空,根据示例3,也是返回false,由于树是空的,所以不存在根节点到叶子节点的路径。
如果根节点只有一个根节点,就直接比较根节点的值与参数sum即可。
不然,我们就递归判断,我们每次递归每个节点的左右节点,并减去每个节点的val值,上面也是递归结束的条件。
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
是一次通过的。需要注意递归退出条件以及节点为空时的情况。
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ bool hasPathSum(struct TreeNode *root, int sum) { if (root == NULL) { return false; } if (root->left == NULL && root->right == NULL) { return sum == root->val; } return hasPathSum(root->left, sum - root->val) || hasPathSum(root->right, sum - root->val); }还有大佬写的BFS:
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; } 作者:LeetCode-Solution 链接:https://leetcode.cn/problems/path-sum/solution/lu-jing-zong-he-by-leetcode-solution/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
三、AC 代码:
同上。
四、总结:
题目链接:112. 路径总和
这道题目需要多刷刷几次,递归方法要掌握,建议二刷。