一、题目描述
JZ24 二叉树中和为某一值的路径
题目大意:输入一颗二叉树的根节点和一个整数, 按字典序打印出二叉树中节点值的和为输入整数的所有路径. 路径定义为从数的根节点开始往下一直到叶节点形成一条路径.
注意审题:1. 按字典序打印出所有路径 2. 路径一定是从根结点到某个叶子节点的路径
二、算法(深度优先搜索)
解题思路
- 要求从根到叶子节点的路径, 我们可以想到深度优先搜索, 它可以依次遍历所有的路径, 我们只要在递归时同时维护路径和即可
- 实现技巧:首先, 为了使递归函数更简洁, 我们可以将用于临时保存路径的数组和结果数组定义为成员; 检查是否满足条件时, 我们不必维护路径和, 而是用目标值减去当前路径和, 最终只需检查目标值是否为0即可
代码实现(C++11)
class Solution {
public:
vector<vector<int>> ans; // 结果数组
vector<int> path; // 临时路径
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
dfs(root, expectNumber);
sort(ans.begin(), ans.end()); // 按字典序排序
return ans;
}
void dfs(TreeNode* root, int target){
if(!root) return; // 为空节点返回
path.push_back(root->val); // 当前节点入栈
target -= root->val; // 减去当前值
if(root->left == nullptr && root->right == nullptr && target == 0){ // 检查路径和是否满足条件
ans.push_back(path);
}
dfs(root->left, target); // 向左递归
dfs(root->right, target); // 向右递归
// 回溯
target += root->val;
path.pop_back();
}
}; 时间复杂度:O(n),n为二叉树的节点数,遍历一次二叉树
空间复杂度:O(n),递归栈空间和路径数组的空间

京公网安备 11010502036488号