前言
本文将围绕以下问题展开讨论
如何求解二叉树的路径总和问题(求解:二叉树中 路径之和 为某一定值的路径总数)?
本文将采用两种方法解决此问题(文章末尾附完整代码)
一、如何理解二叉树路径总和
题目链接: [点击跳转] Leetcode 437. 路径总和 III
如下是具体题目要求:
主体要求是需要使树上的节点之和等于给定的目标值 targetSum,除此之外这些节点还需要满足一些条件:
1.节点必须是相邻的。
2.必须是由上到下的(例如图中,即便是3-3-5-2-1这条路径之和满足目标值,也不能计入)
二、方法一(深度优先搜索)
两层递归
相信各位同学在读题时,脑海里直接就会想到这个方法:
将二叉树中的全部非叶节点,全部设为根节点,再依此向下遍历两侧路径,每次遇到路径之和等于目标值的时候,就使计数器+1。
如此一来,将树中的所有节点全部遍历一遍就会得到我们想要的路径总数。
代码如下(示例):
首先我们定义了一个函数pathSum,这个函数通过传入根节点,以及目标值,就可以返回我们所需的路径总和。
int pathSum(TreeNode* root, int targetSum) {
return ans;
}
然后,我们考虑到,如果传入的节点为空,那么我们需要返回一个 0 ,用来表示没有路径。
int pathSum(TreeNode* root, int targetSum) {
if(root==nullptr){
return 0;
}
return ans;
}
好了,现在我们应该思考如何去实现遍历子树的路径了,于是我们定义了一个递归函数length,通过传入节点和目标和,返回 该根节点下的 满足要求的路径数 。运用递归的方式,将该节点下的左侧节点和右侧节点传入,同时减去根节点的值。
举例说明:
当我们找符合目标值为12的路径时,先找到7,然后接着向下搜索3和4,这个时候,我们就不需要再找targetSum=12的情况了,我们可以直接以3或者4为根节点,去找targetSum=5的情况(5=12-7)
7
/ \
3 4
/ \
2 1
同时设置一个计数器sum,从上到下搜索时,每次将targetSum减去的根节点值,所以当targetSum等于当前节点值的时候,就正好是到当前节点的路径和等于初始的targetSum,因此我们可以得到如下代码:
int length(TreeNode* root,long targetSum){
//这里target用long类型
int sum=0;//记录每个根节点下子树路径数
if(root==nullptr){
return 0;
}
if(targetSum==root->val){
sum++;
}
sum=sum+length(root->left,targetSum-root->val);
sum=sum