113. 路径总和 II
题目描述:
给你二叉树的根节点 root
和一个整数目标和 targetSum
,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
题解思路:
利用回溯来遍历每一种情况,找到符合题目要求的路径,添加进vector<vector>中。
定义一个全局的vector<vector> result来存放结果
定义一个全局的vector every来存放符合条件的路径
- 这个符合条件可以利用acommulate来对every进行求和,如果求和结果等于给定的条件则将该路径加入到result中
- 部分代码:
if(accumulate(every.begin(),every.end(),0) == count) result.push_back(every);
递归三件套
- 参数和返回值
- 根节点和targetSum,targetSum用来判断某路径是否符合要求,需要访问整棵树才可以得出结果,不需要像leetcode112路径总和1那样找到了符合的就返回,所以这道题不需要返回值,只需要通过它来改变全局变量resul即可
- 终止条件
- 当访问的是叶子节点的时候,来判断该路径是否符合条件
- 本层逻辑
- 回溯就在这个地方
- 部分代码:
if(root->left){ every.push_back(root->left->val); //回溯 backTracking(root->left,count); every.pop_back(); //回溯 } //右 if(root->right){ every.push_back(root->right->val); //回溯 backTracking(root->right,count); every.pop_back(); //回溯 }
完整代码:
class Solution { public: vector<vector<int>> result; vector<int> every; void backTracking(TreeNode * root, int count){ if(!root->left && !root->right){ if(accumulate(every.begin(),every.end(),0) == count) result.push_back(every); return; } //左 if(root->left){ every.push_back(root->left->val); backTracking(root->left,count); every.pop_back(); } //右 if(root->right){ every.push_back(root->right->val); backTracking(root->right,count); every.pop_back(); } } vector<vector<int>> pathSum(TreeNode* root, int targetSum) { result.clear(); every.clear(); if(!root) return result; every.push_back(root->val); backTracking(root, targetSum); return result; } };