Tree Path Sum III

https://leetcode.com/problemset/algorithms/
题意是在一颗树中统计 多个连续节点的和等于某一个值sum的组合数(相邻节点必须是父子关系)

我的思路是 递归返回一个数组记录一个节点所对应的各条路径对应的和
例如树[1,2,3,4,5,6,7]
1
2 3
4 5 6 7
以节点2为例以它为起点的路径所有节点的和分别为2、2+4、2+5三种选择,对应数组[2,6,7],同理以节点3为起点对应的数组是[3,9,10]。如果以节点1为起点则它的“路径和”分别为1,1+2,1+6,1+7
,1+3,1+9,1+10 [1,3,7,8,4,10,11]。然后可以通过统计每个节点对应的路径和中与sum相等的个数。

class Solution {
public:
    int result;
    int pathSum(TreeNode* root, int sum) {
        recusion(root, sum);
        return result;
    }
    
    vector recusion(TreeNode* root, int sum){
         vector vecAll;//供父节点选择
         if(root == NULL){
            return vecAll;
         }
        
         if(root->val == sum){
            result++;   
         }
        
         if((root->right == NULL)&&(root->left == NULL)){
            vecAll.push_back(root->val);
            return vecAll;
         }
        
         vector vecLeft = recusion(root->left, sum);
         vector vecRight = recusion(root->right, sum);
       
         vecLeft.insert(vecLeft.end(), vecRight.begin(), vecRight.end()); 
         vecAll = vecLeft;
        
        for(vector::iterator it = vecAll.begin(); it!=vecAll.end(); it++)
      {
            int i = *it;
            int jude = root->val+i;
            if(jude == sum){
                result++;
            }
            *it = *it+root->val;
        }
        vecAll.push_back(root->val);
        return vecAll;
    }
};

下面是一个更巧妙的算法。是从头节点为起点计算各种符合条件的“路径和”。sumUp方法通过递归计算出以对应节点root为起点所对应的所有的符合条件的路径的数目,然后通过pathSum递归计算出以root节点的子节点为起点符合条件的路径数目,后将统计出的相加便是最后的结果。

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);
    }
};

你可能感兴趣的:(Tree Path Sum III)