路径之和Ⅱ
题目[leetcode113]
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[ [5,4,11,2], [5,8,4,5] ]
思路
所需的基础知识可点击:二叉树的基础知识中了解,那么这就不废话了,下面开始介绍解题思路。
按照题目要求,选择前序遍历来满足从根节点到叶子节点的遍历模式,再利用由vector实现的栈来储存路径中的值,path_sum来计算该路径的总值,当深度遍历到叶子节点时,比较是否等于目标总值,若是,再将存储的路径存入到二维数组中,完成答案的存储,当然仍须注意的是,当最终某路径的总值不满足目标总值,则结束递归,而减去该节点下的值且弹出栈顶,完成回溯操作。
具体过程如下:
实现代码如下:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
std::vector<std::vector<int>> result;
std::vector<int> path;
int path_value = 0;
preorder(root, path_value, sum, path, result);
return result;
}
private:
void preorder(TreeNode* node, int path_value, int sum,std::vector<int> &path, vector<vector<int>> &result){
if(!node){
return;
}
path_value += node->val;
path.push_back(node->val);
if(path_value == sum && !node->left && !node->right){ //为叶节点且总值相等
result.push_back(path);
}
preorder(node->left, path_value, sum, path, result);
preorder(node->right, path_value, sum, path, result);
path_value -= node->val; //回溯操作
path.pop_back();
}
};
致谢
本章知识点和思路由小象学院相关视频提供,由本人学习并梳理得出,希望自己加深记忆的同时,也能给大家提供更多有关于一些算法的知识点。
你的点赞、评论、收藏就是对我最大的支持与鼓励,谢谢!