二叉树的路径之和
Posted 算法刷题解析
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的路径之和相关的知识,希望对你有一定的参考价值。
描述:给定一个二叉树和一个目标值,判断是否存在一个从根节点到叶子节点的路径,使得该路径上数字之和与目标值相等,若存在这样的路径,则返回true,若不存在则返回false。
因为路径9 -> 5 -> 4 -> 4满足9+5+4+4 == 24,故返回true。若targetSum = 20, 则返回false,因为任意路径的和都不等于20。
由于二叉树是递归出来的数据结构,因此,与二叉树有关的题目,可以第一时间考虑递归算法。本题目的分析突破点为:对于任意路径,最起始的节点都是根节点。因此若存在满足条件的路径,那么必然存在从root的子节点(左节点或右节点)到叶子节点的路径之和满足targetSum – root->val这个新的目标值。root的子节点和新的目标值targetSum-root->val可以继续递归。代码如下:
bool hasPathSum(TreeNode* root, int targetSum)
{
if(!root) return false;
int remainSum = targetSum - root->val;
if(!root->left && !root->right && !remainSum) return true; //叶子节点的remainSum==0,才表明路径正确
return hasPathSum(root->left,remainSum) || hasPathSum(root->right, remainSum);
}
为了对递归过程进行回溯,每次递归结束前都将path数组的最后一个数(也就是这一级递归时放入的root->val)弹出。具体的代码如下:
void partPathSum(TreeNode *root, int sum,vector<int> &path, vector<vector<int>> &res)
{
if(!root) return; //递归的结束条件
int partSum = sum - root->val;
path.push_back(root->val);
if(!partSum && !root->left&& !root->right)
res.push_back(path); //找到满足条件的路径,将该路径加入到res中
if(root->left)
partPathSum(root->left,partSum, path, res); //左子树的递归
if(root->right)
partPathSum(root->right,partSum, path, res); //右子树的递归
path.pop_back(); //回溯的过程
}
vector<vector<int>> pathSum(TreeNode* root, int targetSum)
{
vector<vector<int>> res;
if(!root) return res;
vector<int> path; //存放递归过程中的路径
partPathSum(root, targetSum, path, res);
return res;
}
以上是关于二叉树的路径之和的主要内容,如果未能解决你的问题,请参考以下文章
2021-12-15: 路径总和 III。给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开