二叉树的路径总和问题(一)的具体思路 穷举递归法 前缀和回溯法(附完整代码)


前言

本文将围绕以下问题展开讨论

如何求解二叉树的路径总和问题(求解:二叉树中 路径之和 为某一定值的路径总数)?

本文将采用两种方法解决此问题(文章末尾附完整代码)


一、如何理解二叉树路径总和

题目链接: [点击跳转] 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值