剑指 Offer(第2版)面试题 34:二叉树中和为某一值的路径
剑指 Offer(第2版)面试题 34:二叉树中和为某一值的路径
题目来源:47. 二叉树中和为某一值的路径
解法1:深度优先搜索
从根节点开始深度优先搜索:
- 当搜索到空节点时,直接返回;
- 当 path 中所有元素的和已经超过 sum 时,说明该路径不行,直接返回;
- 当搜索到叶子节点时,如果数组 path 中所有元素的和 + 叶子节点的值等于目标和 sum 时,说明我们找到了一条和为 sum 的路径,将叶子节点值插入 path,再将 path 插入答案 paths 中;
- 将当前节点值插入数组 path,向左右子树分别继续深度优先搜索。
代码:
/**
* 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
{
private:
vector<vector<int>> paths;
public:
vector<vector<int>> findPath(TreeNode *root, int sum)
{
if (root == nullptr)
return {
};
vector<int> path;
dfs(root, paths, path, sum);
return paths;
}
void dfs(TreeNode *root, vector<vector<int>> &paths, vector<int> path, int sum)
{
if (root == nullptr)
return;
if (accumulate(path.begin(), path.end(), 0) > sum)
return;
if (root->left == nullptr && root->right == nullptr)
if (accumulate(path.begin(), path.end(), 0) + root->val == sum)
{
path.push_back(root->val);
paths.push_back(path);
return;
}
path.push_back(root->val);
if (root->left)
dfs(root->left, paths, path, sum);
if (root->right)
dfs(root->right, paths, path, sum);
}
};
复杂度分析:
时间复杂度:O()
空间复杂度:O()