递归、回溯法:
class Solution {
private:
bool traversal(TreeNode* cur,int targetSum){
if(!cur->left&&!cur->right&&targetSum==0) return true;
if(!cur->left&&!cur->right) return false;
if(cur->left) {
targetSum=targetSum-cur->left->val;
if(traversal(cur->left,targetSum))
return true;
targetSum=targetSum+cur->left->val;
}
if(cur->right) {
targetSum=targetSum-cur->right->val;
if(traversal(cur->right,targetSum))
return true;
targetSum=targetSum+cur->right->val;
}
return false;
}
public:
bool hasPathSum(TreeNode* root, int targetSum) {
if(root==nullptr) return false;
return traversal(root,targetSum-root->val);
}
};
递归【精简版】
class Solution {
public:
bool hasPathSum(TreeNode* root, int targetSum) {
if(root==nullptr) return false;
if(!root->left&&!root->right&&targetSum==root->val) return true;
return hasPathSum(root->left,targetSum-root->val)||hasPathSum(root->right,targetSum-root->val);
}
};
迭代法:
- 使用栈实现迭代法
- 前序遍历,入栈的时候先右后左
- 定义pair数据类型,既记录该节点又记录路径和
- pair<TreeNode*,int>:first、second
class Solution {
public:
bool hasPathSum(TreeNode* root, int targetSum) {
if(root==nullptr) return false;
stack<pair<TreeNode*,int>> st;
st.push(pair<TreeNode*,int> (root,root->val));
while(!st.empty()){
pair<TreeNode*,int> node=st.top();
st.pop();
if(node.first->left==nullptr&&node.first->right==nullptr&&node.second==targetSum) return true;
if(node.first->right){
st.push(pair<TreeNode*,int>(node.first->right,node.second+node.first->right->val));
}
if(node.first->left){
st.push(pair<TreeNode*,int>(node.first->left,node.second+node.first->left->val));
}
}
return false;
}
};