题目链接:113. 路径总和 II

题解:

和上一题类似,简单递归!

题目简述:

和上一题类似,多加了一个记录路径的要求!

题解:

递归:

  • 根节点为空直接返回
  • 将当前节点加入路径
  • 答案条件:到了叶子结点并且sum减到了0
  • 左子树不空递归左子树
  • 右子树不空递归右子树
  • 将当前加点删掉,恢复状态

由于要走遍所有情况,所以和上一题相比少了一个都不空的情况!

时间复杂度:遍历所有节点为O(n),记录所有路径为O(n),总复杂度为O(n^2)

AC代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
vector<vector<int>> pathSum(TreeNode* root, int sum) {
dfs(root, sum);
return res;
}
void dfs(TreeNode* root, int sum){
if(!root) return;
path.push_back(root->val);
sum -= root->val;
if(!root->left && !root->right){
if(sum == 0) res.push_back(path);
}
if(root->left) dfs(root->left, sum);
if(root->right) dfs(root->right, sum);
path.pop_back();
}
};