257. 二叉树的所有路径
题目链接:257. 二叉树的所有路径 - 力扣(LeetCode)
给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
解题思路:
class Solution {
public:
void getPath(TreeNode* cur,string path,vector<string>& result){
// 将当前节点的值转换为字符串并添加到路径中
if(!path.empty()){
path += "->"; // 如果路径不为空,添加分隔符
}
path += to_string(cur->val);
// 如果是叶子节点,则将路径添加到结果中
if(!cur->left && !cur->right){
result.push_back(path);
return;
}
// 否则,递归地处理左右子树
if(cur->left)getPath(cur->left,path,result);
if(cur->right)getPath(cur->right,path,result);
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
if(root == NULL)return result;
getPath(root,"",result);
return result;
}
};
112. 路径总和
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true
;否则,返回 false
。
class Solution {
public:
bool findPath(TreeNode* cur,int sum){
sum -= cur->val;// 更新目标值
if(!cur->left && !cur->right){
if(sum == 0)return true;// 如果更新后的sum等于0,则找到了一条满足条件的路径
else return false;
}
if(cur->left){
if(findPath(cur->left,sum))
return true;
}
if(cur->right){
if(findPath(cur->right,sum))
return true;
}
// 如果在左右子树中都没有找到满足条件的路径,则返回false
return false;
}
bool hasPathSum(TreeNode* root, int targetSum) {
if(root == NULL)return false;
return findPath(root,targetSum);
}
};
精简后的代码:
bool hasPathSum(TreeNode* root, int targetSum) {
if(root == NULL)return false;
if(!root->left && !root->right && (targetSum - root->val) == 0)return true;
return hasPathSum(root->left,targetSum - root->val) || hasPathSum(root->right,targetSum - root->val);
}
113. 路径总和ii
题目链接:113. 路径总和 II - 力扣(LeetCode)
给你二叉树的根节点 root
和一个整数目标和 targetSum
,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
解题思路:
class Solution {
public:
vector<vector<int>> result;// 存储所有满足条件的路径
void findPath(TreeNode* cur,vector<int>& path,int sum){
sum -= cur->val; // 更新目标值
path.push_back(cur->val);// 将当前节点的值加入路径
// 如果当前节点是叶子节点
if(!cur->left && !cur->right && sum == 0){
// 如果更新后的sum等于0,则找到了一条满足条件的路径
result.push_back(path);
}
// 如果当前节点有左子树,递归调用findPath函数
if(cur->left){
findPath(cur->left,path,sum);
}
// 如果当前节点有右子树,递归调用findPath函数
if(cur->right){
findPath(cur->right,path,sum);
}
// 在返回之前,从路径中移除当前节点的值
path.pop_back();
}
vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
vector<int> path;
if(root == NULL)return result;
findPath(root,path,targetSum);
return result;
}
};
注意:
在本题中,我们要显示的回溯,因为传入的path使引用类型,这是会拷贝地址的。每一次的递归都会对path进行修改,且会传到下一层,所以在返回之前,需要对path.pop。sum为什么不需要显示的回溯,因为sum是int,每一层之间的sum不会相互影响,也就是下一层的sum的修改,对这一层sum的值不会有影响。