[leetcode] 437. Path Sum III

本文探讨了在二叉树中寻找所有路径使其和等于给定值的算法,重点介绍了递归方法,并提供了C++和Python的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

You are given a binary tree in which each node contains an integer value.

Find the number of paths that sum to a given value.

The path does not need to start or end at the root or a leaf, but it must go downwards (traveling only from parent nodes to child nodes).

The tree has no more than 1,000 nodes and the values are in the range -1,000,000 to 1,000,000.

Example:

root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8

      10
     /  \
    5   -3
   / \    \
  3   2   11
 / \   \
3  -2   1

Return 3. The paths that sum to 8 are:

1.  5 -> 3
2.  5 -> 2 -> 1
3. -3 -> 11

分析

题目的意思是:在二叉树找出路径的和为sum值的所有路径,路径不需要从根结点到叶子节点。

  • 解题方法还是递归,递归注意终止条件,返回条件,递归的条件就行了。很显然这道题有三种方式,即向左,从根结点,向右。所以总数为这三种方式的和。注意如果当前求和等于给定的sum后也可以继续递归的,所以注意返回条件。

C++实现

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int pathSum(TreeNode* root, int sum) {
        if(!root) return 0;
        return getSum(root,0,sum)+pathSum(root->left,sum)+pathSum(root->right,sum);
    }
private:
    int getSum(TreeNode* root, int cur,int sum){
        if(!root){
            return 0;
        }
        cur=cur+root->val;
        return (sum==cur)+getSum(root->left,cur,sum)+getSum(root->right,cur,sum);
    }
};

Python实现

这道题分析的点是不一定是根节点,所以在遍历的时候需要注意左右分支得当成根节点递归的进行遍历,然后当前的根节点,也需要正常递归。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def pathSum(self, root: Optional[TreeNode], targetSum: int) -> int:
        if root is None:
            return 0
        
        return self.solve(root, 0, targetSum)+self.pathSum(root.left, targetSum)+self.pathSum(root.right, targetSum)


    def solve(self, root, cur, target):
        if root is None:
            return 0
        cur = cur+root.val
        left = self.solve(root.left,cur,target)
        right = self.solve(root.right, cur, target)
        
        if cur==target:
            cnt=1
        else:
            cnt = 0
        return  cnt+left+right

下面有一个不是很fancy的解决方案:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    res=0

    def solve(self, root, cur, targetSum):
        if not root:
            return 
        if cur+root.val==targetSum:
            self.res+=1
        self.solve(root.left,cur+root.val, targetSum)
        self.solve(root.right, cur+root.val, targetSum)

    def pathSum(self, root: TreeNode, targetSum: int) -> int:
        if not root:
            return 0
        self.solve(root,0,targetSum)
        self.pathSum(root.left,targetSum)
        self.pathSum(root.right,targetSum)
        return self.res

参考文献

437. Path Sum III

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民小飞侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值