一.题目
Path Sum II
Total Accepted: 46778 Total Submissions: 175830Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.
For example: Given the below binary tree andsum = 22
, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1
return
[ [5,4,11,2], [5,8,4,5]]
Show Tags
Have you met this question in a real interview?
Yes
No
二.解题技巧
这道题和类似,仅仅只是这道题须要找到全部和等于给定值的路径,因此不能在中间部分进行剪枝。必须遍历全然部的路径。
这里面有一个技巧,在进入每个结点的时候。先将该结点的值push到vector中。在退出时间该结点的值pop出来,这样就能够避免有时会忘记pop结点的值的情况。
这样的做法的时间复杂度为O(n),空间复杂度为O(logn)。
三.实现代码
#include#include using std::vector;/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};class Solution{private: void pathSum(TreeNode* root, int sum, vector > &Result, vector &TmpResult) { if (!root) { return; } if (!root->left && !root->right && root->val == sum) { TmpResult.push_back(sum); Result.push_back(TmpResult); // pop the leaf node TmpResult.pop_back(); return; } int SumChild = sum - root->val; TmpResult.push_back(root->val); pathSum(root->left, SumChild, Result, TmpResult); pathSum(root->right, SumChild, Result, TmpResult); // pop the current node TmpResult.pop_back(); }public: vector > pathSum(TreeNode* root, int sum) { vector > Result; vector TmpResult; pathSum(root, sum, Result, TmpResult); return Result; }};
四.体会
这道题和类似,解法也是同样的吗。仅仅是不能进行剪枝而已。
版权全部,欢迎转载。转载请注明出处,谢谢