void pathSumRec(vector<vector<int> > &grid, int &kM, int &kN, int &sum, int &min_sum, int &m, int &n) { if (m==kM && n==kN) { if (min_sum == 0) { min_sum = sum; } if (min_sum > sum) { min_sum = sum; } return; } if (m<kM) { m++; sum = sum + grid[m][n]; pathSumRec(grid, kM, kN, sum, min_sum, m, n); sum = sum - grid[m][n]; m--; } if (n<kN) { n++; sum = sum + grid[m][n]; pathSumRec(grid, kM, kN, sum, min_sum, m, n); sum = sum - grid[m][n]; n--; } }
int pathSumRec(TreeNode* root, int sum) //以root为起点,找到和为sum的路径个数 { if (root == nullptr) return 0; int rootmatch = (root->val == sum); int left = pathSumRec(root->left, sum - root->val); int right = pathSumRec(root->right, sum - root->val); return rootmatch + left + right; }
void pathSumRec(TreeNode *root, int sum, vector<vector<int>>& res, vector<int>& path) { if (!root) return; if (!root->left && !root->right) { if (root->val == sum) { path.push_back(root->val); res.push_back(path); path.pop_back(); } return; } path.push_back(root->val); pathSumRec(root->left, sum - root->val, res, path); pathSumRec(root->right, sum - root->val, res, path); path.pop_back(); }
int minPathSum(vector<vector<int> > &grid) { int kM = grid.size()-1; int kN = grid[0].size()-1; int m = 0; int n = 0; int sum = grid[m][n]; int min_sum = 0; pathSumRec(grid, kM, kN, sum, min_sum, m, n); return min_sum; }
int pathSum(TreeNode* root, int sum) { if (root == nullptr) return 0; int rootval = pathSumRec(root, sum); int lefttree = pathSum(root->left, sum); int righttree = pathSum(root->right, sum); return (rootval + lefttree + righttree); }
vector<vector<int> > pathSum(TreeNode *root, int sum) { vector<vector<int>> res; vector<int> path; pathSumRec(root, sum, res, path); return res; }