您的位置:首页 > 编程语言 > C语言/C++

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

2017-07-24 20:21 537 查看

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   1

Return 3. The paths that sum to 8 are:

1.  5 -> 3
2.  5 -> 2 -> 1
3. -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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息