本文主要是介绍剑指 Offer(第2版)面试题 34:二叉树中和为某一值的路径,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
剑指 Offer(第2版)面试题 34:二叉树中和为某一值的路径
- 剑指 Offer(第2版)面试题 34:二叉树中和为某一值的路径
- 解法1:深度优先搜索
剑指 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()
这篇关于剑指 Offer(第2版)面试题 34:二叉树中和为某一值的路径的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!