[LeetCode]437. Path Sum III(求二叉树中路径和等于sum的数量)

来源:互联网 发布:国产电视推荐 知乎 编辑:程序博客网 时间:2024/05/22 00:06

437. Path Sum III

原题链接
相似题目题解:112. Path Sum && 113. Path Sum II

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   1Return 3. The paths that sum to 8 are:1.  5 -> 32.  5 -> 2 -> 13. -3 -> 11

题目大意:

  • 这道题跟112和113类似,只是路径的开头和结尾不用是根节点和叶节点
  • 求出二叉树路径和等于sum的路径数量

思路:

  • 利用DFS的思想,遍历二叉树
  • 先遍历路径开头是根节点的路径,找出符合条件的数量,再求路径开头是根节点左孩子的路径,找出符合条件的数量,依次遍历
  • 由于只需要返回数量,所以只需要找到符合条件路径,+1即可
  • 注意helper函数参数pre前不加&(引用符号)

代码如下:(23ms)

#include <iostream>#include <queue>using namespace std;//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) {//23ms        if(root == nullptr)            return 0;        return helper(root, 0, sum) + pathSum(root->left, sum) + pathSum(root->right, sum);    }private:    int helper(TreeNode* root, int pre, int &sum){//注意pre前不加&        if(root == nullptr)            return 0;        int current = pre + root->val;        return (current==sum) + helper(root->left, current, sum) + helper(root->right, current, sum);    }};// 创建二叉树TreeNode* CreateTreeByLevel(vector<int> num){    int len = num.size();    if(len == 0){        return NULL;    }//if    queue<TreeNode*> queue;    int index = 0;    // 创建根节点    TreeNode *root = new TreeNode(num[index++]);    // 入队列    queue.push(root);    TreeNode *p = NULL;    while(!queue.empty() && index < len){        // 出队列        p = queue.front();        queue.pop();        // 左节点        if(index < len && num[index] != NULL){            // 如果不空创建一个节点            TreeNode *leftNode = new TreeNode(num[index]);            p->left = leftNode;            queue.push(leftNode);        }        index++;        // 右节点        if(index < len && num[index] != NULL){            // 如果不空创建一个节点            TreeNode *rightNode = new TreeNode(num[index]);            p->right = rightNode;            queue.push(rightNode);        }        index++;    }//while    return root;}int main(){    Solution s;    vector<int> num = {10,5,-3,3,2,NULL,11,3,-2,NULL,1};    TreeNode* root = CreateTreeByLevel(num);    cout<< s.pathSum(root,8) <<endl;    return 0;}
原创粉丝点击