路径总和 思路 回溯.
不推荐层次遍历, 代码比较复杂.
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: vector<vector<int>> res; int targetSum_; void dfs(vector<int> &path, int value, map<TreeNode*, bool>& visited, TreeNode * root){ if(root->left == nullptr && root->right == nullptr && value == targetSum_){ res.push_back(path); } if(root->left != nullptr && visited[root->left] == false) { path.push_back(root->left->val); value += root->left->val; visited[root->left] = true; dfs(path, value, visited, root->left); visited[root->left] = false; value -= root->left->val; path.pop_back(); } if(root->right != nullptr && visited[root->right] == false){ path.push_back(root->right->val); value += root->right->val; visited[root->right] = true; dfs(path, value, visited, root->right); visited[root->right] = false; value -= root->right->val; path.pop_back(); } } vector<vector<int>> pathSum(TreeNode* root, int targetSum) { targetSum_ = targetSum; if(root == nullptr) return res; vector<int> path; map<TreeNode *, bool> visited; visited[root] = true; path.push_back(root->val); dfs(path, root->val, visited, root); return res; } };
class Solution { List<List<Integer>> ret = new LinkedList<List<Integer>>(); Map<TreeNode, TreeNode> map = new HashMap<TreeNode, TreeNode>(); public List<List<Integer>> pathSum(TreeNode root, int sum) { if (root == null) { return ret; } Queue<TreeNode> queueNode = new LinkedList<TreeNode>(); Queue<Integer> queueSum = new LinkedList<Integer>(); queueNode.offer(root); queueSum.offer(0); while (!queueNode.isEmpty()) { TreeNode node = queueNode.poll(); int rec = queueSum.poll() + node.val; if (node.left == null && node.right == null) { if (rec == sum) { getPath(node); } } else { if (node.left != null) { map.put(node.left, node); queueNode.offer(node.left); queueSum.offer(rec); } if (node.right != null) { map.put(node.right, node); queueNode.offer(node.right); queueSum.offer(rec); } } } return ret; } public void getPath(TreeNode node) { List<Integer> temp = new LinkedList<Integer>(); while (node != null) { temp.add(node.val); node = map.get(node); } Collections.reverse(temp); ret.add(new LinkedList<Integer>(temp)); } }