原题地址(中等)
方法1—深度优先搜索
这题有一个大坑:那就是没说结点一定为正,所以不能通过 sum<0 来减枝,只能一条路径一条路径的搜索查看。
**
常规的深搜就可以解决,但是要多注意一些细节。
class Solution {public:vector<int> v;vector<vector<int>> vv;vector<vector<int>> pathSum(TreeNode* root, int sum) {dfs(root, sum);return vv;}void dfs(TreeNode* root, int target) {if(!root) return;v.push_back(root->val);target -= root->val;if(root && !root->left && !root->right && target == 0)vv.push_back(v);dfs(root->left, target);dfs(root->right, target);v.pop_back();}};
方法2—广度优先搜索
思路是用一个哈希表来存储每个结点的父节点。然后用广度优先找到符合条件的叶子结点,再通过查找哈希表就可以还原出路径。
class Solution {public:vector<vector<int>> ret;unordered_map<TreeNode*, TreeNode*> parent;void getPath(TreeNode* node) { // 还原路径vector<int> tmp;while (node) {tmp.push_back(node->val);node = parent[node];}reverse(tmp.begin(), tmp.end());ret.push_back(tmp);}vector<vector<int>> pathSum(TreeNode* root, int sum) {if (root == nullptr) {return ret;}queue<TreeNode*> que_node;queue<int> que_sum;que_node.emplace(root);que_sum.emplace(0);while (!que_node.empty()) {TreeNode* node = que_node.front();que_node.pop();int rec = que_sum.front() + node->val;que_sum.pop();if (!node->left&& !node->right && rec == sum) {getPath(node);}if (node->left) {parent[node->left] = node;que_node.push(node->left);que_sum.push(rec);}if (node->right) {parent[node->right] = node;que_node.push(node->right);que_sum.push(rec);}}return ret;}};
