二叉树的路径之和

Posted 算法刷题解析

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的路径之和相关的知识,希望对你有一定的参考价值。

描述:给定一个二叉树和一个目标值,判断是否存在一个从根节点到叶子节点的路径,使得该路径上数字之和与目标值相等,若存在这样的路径,则返回true,若不存在则返回false。


 
如上图所示的二叉树,若目标值targetSum= 22

二叉树的路径之和

因为路径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);}
该题相对简单,但是有难度更大的变体, 就是输出满足条件的路径。 如targetSum = 22,则输出{{9, 5, 4, 4},{9, 6, 7}}。 对于该变体,思路跟上边题目类似,涉及到递归和回溯。具体的思路如下:

如上图所示:该二叉树最多可以递归四次,对于图中所示的递归路线,第一层递归的根节点root = 9,sum = 22,将当前根节点的值9加入到path数组中,然后将sum – root->val作为第二级递归的目的sum值,依次往下递归。当递归到某一路径的叶子节点时,若当前的root->val与当前的目的sum值相等,则表明该路径是满足要求的路径,然后将path数组加入到结果数组中。
但是对于如上图所示的递归路径,当递归到叶子节点3时,此时的root != sum,这表明这条路径不满足要求。

为了对递归过程进行回溯,每次递归结束前都将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 的 路径 的数目。路径 不需要从根节点开

LeetCode与《代码随想录》二叉树篇:做题笔记与总结-JavaScript版

二叉树的带权路径长度WPL算法实现

最优二叉树求权值

一道关于二叉树的字节面试题的思考