LeetCode 112. 路径总和 | C++语言版
LeetCode 112. 路径总和
题目描述
题目地址:112. 路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
解题思路
思路一:使用递归
代码实现
C++
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool traversal(TreeNode* cur,int count){
//是否存在 根节点到叶子节点的路径,使路径上所有节点值相加等于目标和 targetSum
//不要去累加然后判断是否等于目标和,那么代码比较麻烦,可以用递减,让计数器count初始为目标和,然后每次减去遍历路径节点上的数值
//如果最后count == 0,同时到了叶子节点的话,说明找到了目标和
if(!cur->left && !cur->right && count==0) return true;
//遇到叶子节点而没找到合适的边,直接返回false
if(!cur->left && !cur->right) return false;
//左
if(cur->left){
// 递归,处理节点
count-=cur->left->val;
if(traversal(cur->left,count)) return true;
// 回溯,撤销处理结果
count+=cur->left->val;
}
//右
if(cur->right){
// 递归,处理节点
count-=cur->right->val;
if(traversal(cur->right,count)) return true;
// 回溯,撤销处理结果
count+=cur->right->val;
}
return false;
}
bool hasPathSum(TreeNode* root, int targetSum) {
if(root==NULL) return false;
return traversal(root,targetSum-root->val);
}
};
运行结果
参考文章:
https://programmercarl.com/0112.%E8%B7%AF%E5%BE%84%E6%80%BB%E5%92%8C.html#%E6%80%9D%E8%B7%AF
思路二:减少遍历节点数
代码实现
C++
在这里插入代码片