原题地址(中等)

方法1—深度优先搜索

这题有一个大坑:那就是没说结点一定为正,所以不能通过 sum<0 来减枝,只能一条路径一条路径的搜索查看。
**
常规的深搜就可以解决,但是要多注意一些细节。

  1. class Solution {
  2. public:
  3. vector<int> v;
  4. vector<vector<int>> vv;
  5. vector<vector<int>> pathSum(TreeNode* root, int sum) {
  6. dfs(root, sum);
  7. return vv;
  8. }
  9. void dfs(TreeNode* root, int target) {
  10. if(!root) return;
  11. v.push_back(root->val);
  12. target -= root->val;
  13. if(root && !root->left && !root->right && target == 0)
  14. vv.push_back(v);
  15. dfs(root->left, target);
  16. dfs(root->right, target);
  17. v.pop_back();
  18. }
  19. };

方法2—广度优先搜索

思路是用一个哈希表来存储每个结点的父节点。然后用广度优先找到符合条件的叶子结点,再通过查找哈希表就可以还原出路径。

  1. class Solution {
  2. public:
  3. vector<vector<int>> ret;
  4. unordered_map<TreeNode*, TreeNode*> parent;
  5. void getPath(TreeNode* node) { // 还原路径
  6. vector<int> tmp;
  7. while (node) {
  8. tmp.push_back(node->val);
  9. node = parent[node];
  10. }
  11. reverse(tmp.begin(), tmp.end());
  12. ret.push_back(tmp);
  13. }
  14. vector<vector<int>> pathSum(TreeNode* root, int sum) {
  15. if (root == nullptr) {
  16. return ret;
  17. }
  18. queue<TreeNode*> que_node;
  19. queue<int> que_sum;
  20. que_node.emplace(root);
  21. que_sum.emplace(0);
  22. while (!que_node.empty()) {
  23. TreeNode* node = que_node.front();
  24. que_node.pop();
  25. int rec = que_sum.front() + node->val;
  26. que_sum.pop();
  27. if (!node->left&& !node->right && rec == sum) {
  28. getPath(node);
  29. }
  30. if (node->left) {
  31. parent[node->left] = node;
  32. que_node.push(node->left);
  33. que_sum.push(rec);
  34. }
  35. if (node->right) {
  36. parent[node->right] = node;
  37. que_node.push(node->right);
  38. que_sum.push(rec);
  39. }
  40. }
  41. return ret;
  42. }
  43. };