java sum3算法,leetcode 437. Path Sum III | 递归!!

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

Discuss

查看了几种方案, 递归的方式最简单, 其次运用leetcode 1 Two sum类似的简化方法.

双递归

Java

public class Solution {

public int pathSum(TreeNode root, int sum) {

if(root == null)

return 0;

return findPath(root, sum) + pathSum(root.left, sum) + pathSum(root.right, sum);

}

public int findPath(TreeNode root, int sum){

int res = 0;

if(root == null)

return res;

if(sum == root.val)

res++;

res += findPath(root.left, sum - root.val);

res += findPath(root.right, sum - root.val);

return res;

}

}

C++

class Solution {

public:

int pathSum(TreeNode* root, int sum) {

if(!root) return 0;

return sumUp(root, 0, sum) + pathSum(root->left, sum) + pathSum(root->right, sum);

}

private:

int sumUp(TreeNode* root, int pre, int& sum){

if(!root) return 0;

int current = pre + root->val;

return (current == sum) + sumUp(root->left, current, sum) + sumUp(root->right, current, sum);

}

};

上述两段代码主要区别在于sumup的写法, 都有借鉴之处, 总结后自己代码如下所示

// 第一种方式, 比较直观

int sumup(TreeNode *root, int sum) {

int res = 0;

if (sum == root->val) ++res;

if (root->left) res += sumup(root->left, sum - root->val);

if (root->right) res += sumup(root->right, sum - root->val);

return res;

}

// 第二种方式,比较简洁,更"递归范儿"

int sumup(TreeNode *root, int sum) {

if (!root) return 0;

return (sum == root->val) + sumup(root->left, sum - root->val) + sumup(root->right, sum - root->val);

}

待续

Reference

Searches the container for an element with k as key and returns an iterator to it if found, otherwise it returns an iterator to unordered_map::end (the element past the end of the container).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值