LeetCode 112. 路径总和(DFS回溯法)

心血来潮,想写点博客,记录一些自己的学习心得
第一次尝试LEETCODE,直接随机了一题,题目如下:
LeetCode 112. 路径总和(DFS回溯法)_第1张图片 一道简单题,需要算出从根节点到每一个叶子节点的路径总长度,并与给出的目标和比较是否相等,很容易想到用深度优先搜索(回溯法)。来来回回交了三次,居然通过了。
我的代码(很臭):

class Solution {
public:
    bool hasPathSum(TreeNode* root, int sum) {
        int cur_sum=0;
        return dfs(root, sum, cur_sum);
    }
    bool dfs(TreeNode* p, int sum, int &cur_sum){
        if(!p)  return false;
        cur_sum+=p->val;
        if(!p->left && !p->right){
            if(sum==cur_sum)
                return true;
            else
                return false;
        }
        if(dfs(p->left, sum, cur_sum))
            return true;
        if(p->left)//退回上一层时要减去当前节点的值
            cur_sum-=p->left->val;
        if(dfs(p->right,sum, cur_sum))
            return true;
        if(p->right)
            cur_sum-=p->right->val;
        return false;
    }
};

前两次提交,忘记在回溯的时候修改cur_sum的值,导致后面进行递归时,数据不正确。

看了下题解,感觉自己写的过于复杂了,有很多不必要的代码。其实只需要在递归时每次用sum减去当前节点的值,直到叶子节点,判断叶子节点的值是否与剩下的sum值相同就可以了。
代码:

class Solution {
public:
    bool hasPathSum(TreeNode* root, int sum) {
        if(!root) return false;
        if(!root->left && !root->right)
        	if(root->val==sum)
            	return true;
        return hasPathSum(root->left,sum-root->val) || hasPathSum(root->right,sum-root->val);
    }
};

一点感受:1. LEETCODE只需要完成核心函数部分,不需要自己写数据的输入输出,似乎方便许多;
2. 力扣的简单难度,也太不简单了,还是需要多加练习,多多积累。

你可能感兴趣的:(LEETCODE)