剑指offer24_二叉树中和为某一值的路径_题解
二叉树中和为某一值的路径
题目描述
输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
示例1
输入
{10,5,12,4,7},22
返回值
[[10,5,7],[10,12]]
示例2
输入
{10,5,12,4,7},15
返回值
[]
分析
方案一:回溯法
- 递归终止条件:当root节点为叶子节点并且
sum==root->val
, 表示找到了一条符合条件的路径 - 下一次递归:如果左子树不空,递归左子树
FindPath(root->left, sum - root->val)
,如果右子树不空,递归右子树,FindPath(root->right, sum - root->val)
/**
时间复杂度:O(N)
N 为二叉树的节点数,先序遍历需要遍历所有节点。
空间复杂度:O(N)
最差情况下,即树退化为链表时,path 存储所有树节点,使用 O(N) 额外空间。
**/
class Solution
{
public:
void dfs(TreeNode *root, int sum, vector<int> path, vector<vector<int>> &ret)
{
path.push_back(root->val);
// 如果当前节点为叶节点且节点值的和为sum
if (sum == root->val && !root->left && !root->right)
{
ret.push_back(path);
}
sum -= root->val;
// 如果左子树不空,递归左子树
if (root->left)
dfs(root->left, sum, path, ret);
// 如果右子树不空,递归右子树
if (root->right)
dfs(root->right, sum, path, ret);
path.pop_back(); //回溯
}
vector<vector<int>> FindPath(TreeNode *root, int expectNumber)
{
vector<vector<int>> ret;
vector<int> path;
if (!root)
return ret;
dfs(root, expectNumber, path, ret);
return ret;
}
};