112. 路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。
如果存在,返回 true ;否则,返回 false 。叶子节点是指没有子节点的节点。
这道题和题257. 二叉树的所有路径十分类似,代码也相似。
深度优先(O(N),O(N))
在本题使用深度优先的话可以使用前序递归来模拟实现,但是在递归中需要处理的是每个节点的路径和的计算要确保不对其它的节点路径和计算造成影响,所以使用递归的话在其回溯过程会需要处理那些多余的叶节点。
如在上述的路径和计算中,第一条叶子节点的路径和计算为1+2+4,如果此时不满足要求,则需要进行回溯,所以要更新已有结果为1+2,使用递归的话可以完美的解决这种问题,如下面代码中的return就可以实现有效的回溯。
if(root->left == nullptr && root->right == nullptr){
if(num == target) falg = true;
// 否则继续递归
return;
}
具体解题代码如下:
class Solution {
public:
void findPath(TreeNode* root,int num,int target,bool &falg){
// 新加入了节点更新路径和