LeetCode #437 - Path Sum III - Medium

Problem

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:

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

Algorithm

整理一下题意:给定一棵二叉树和一个整数sum,要求在二叉树中找到使得和为sum的所有路径,返回路径的数目。路径的起点可以是树的任意节点。假设这棵二叉树的节点数不超过1000,且所有节点的值在[-1000000,1000000]内。

先考虑特定的起始节点。从该节点出发,若该节点为NULL,则直接返回;若sum等于当前节点的值,则路径数加一。然后选中当前节点,考虑其子节点。对左子和右子分别递归调用findSum函数,注意传入的参数sum需要设置为sum-root->val,表示当前节点选中。

然后考虑对二叉树中的每个节点遍历。

注意,若当前节点的值恰好等于sum,则路径数加一,但是接下来不能直接退出该节点的查找过程。因为从该节点向下,存在一种可能,即该节点的子节点路径之和恰好为0,则这些子节点路径与该节点又组成了一条新的路径。

代码如下。

class Solution {
public:
    int pathSum(TreeNode* root, int sum) {
        if(root==NULL) return 0;
        findSum(root,sum);
        pathSum(root->left,sum);
        pathSum(root->right,sum);
        return psum;
    }
    void findSum(TreeNode* root,int sum){
        if(root==NULL) return;
        if(sum==root->val){
            psum++;
        }
        findSum(root->left,sum-root->val);
        findSum(root->right,sum-root->val);
    }
private:
    int psum=0;
};

你可能感兴趣的:(Leetcode,Tree)