[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; }
相关文章推荐
- LeetCode 437. Path Sum III 题解 和固定的二叉树路径数目
- LeetCode--437. Path Sum III(路径和)Python
- LeetCode 437. Path Sum III (路径之和之三)
- leetcode_437. Path Sum III-二叉树
- 437. Path Sum III(二叉树的路径和之三)
- [LeetCode] 437. Path Sum III 路径和 III
- [LeetCode] Path Sum III 二叉树的路径和之三
- leetcode 437. Path Sum III(路径和)(DFS)
- leetcode 437. Path Sum III
- LeetCode - 437. Path sum III
- [leetcode] 437. Path Sum III 解题报告
- LeetCode 112. Path Sum (二叉树路径之和)
- 【LeetCode】 437. Path Sum III
- [LeetCode]113. Path Sum II(列出二叉树根到叶路径和等于sum的所有路径)
- [LeetCode]437. Path Sum III
- 【二叉树的递归】04找出二叉树中路径和等于给定值的所有路径【Path Sum II】
- [Leetcode] Binary tree maximum path sum求二叉树最大路径和
- LeetCode(124) Binary Tree Maximum Path Sum 二叉树的最大路径和 (如何递归?)
- [leetcode]437. Path Sum III
- LeetCode 437. Path Sum III 递归中使用递归,分两类情况