112. Path Sum

自己的一个错误写法:

class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if(root == NULL)
return false;
int value = ;
return hasPathSum(root,sum,value);
}
bool hasPathSum(TreeNode* root,int sum,int value){
if(root == NULL){
if(value == sum)
return true;
else
return false;
}
bool left = hasPathSum(root->left,sum,value + root->val);
bool right = hasPathSum(root->right,sum,value + root->val);
return left || right;
}
}; Input:
[,] Output:
true
Expected:
false

只有左右节点都为NULL时才是叶子节点,所以这个代码在例子[1,2],1的右节点时就判断错误了,这个右节点虽然sum满足条件,但他本身不是叶子节点

正确写法:

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

113. Path Sum II

class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<vector<int>> result;
vector<int> res;
pathSum(root,sum,result,res);
return result;
}
void pathSum(TreeNode* root,int sum,vector<vector<int>>& result,vector<int>& res){
if(root == NULL)
return;
res.push_back(root->val);
if(!root->left && !root->right && root->val == sum)
result.push_back(res);
pathSum(root->left,sum - root->val,result,res);
pathSum(root->right,sum - root->val,result,res);
res.pop_back();
}
};

第二种写法:

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<vector<int>> result;
vector<int> res;
pathSum(root,sum,res,result);
return result;
}
void pathSum(TreeNode* root,int sum,vector<int> res,vector<vector<int>>& result){
if(root == NULL)
return;
if(!root->left && !root->right && root->val == sum){
res.push_back(root->val);
result.push_back(res);
}
res.push_back(root->val);
pathSum(root->left,sum - root->val,res,result);
pathSum(root->right,sum - root->val,res,result);
return;
}
};

437. Path Sum III

注意:

  1. i只能到size-1,如果到size,就是把所有的和都减掉,相当于没有任何节点相加

  2. 不能写成if(curSum == sum)

       else{

         减去res中之前的数

       }

   因为即使是当前位置到根节点满足情况,也有可能当前位置到根下面的节点也满足情况

class Solution {
public:
int pathSum(TreeNode* root, int sum) {
vector<int> res;
int num = ;
int curSum = ;
pathSum(root,sum,curSum,res,num);
return num;
}
void pathSum(TreeNode* root,int sum,int curSum,vector<int>& res,int& num){
if(root == NULL)
return;
curSum += root->val;
if(curSum == sum)
num++;
res.push_back(root->val);
int t = curSum;
for(int i = ;i < res.size() - ;i++){
t -= res[i];
if(t == sum)
num++;
}
pathSum(root->left,sum,curSum,res,num);
pathSum(root->right,sum,curSum,res,num);
res.pop_back();
}
};

leetcode 112. Path Sum 、 113. Path Sum II 、437. Path Sum III的更多相关文章

  1. 记录我的 python 学习历程-Day13 匿名函数、内置函数 II、闭包

    一.匿名函数 以后面试或者工作中经常用匿名函数 lambda,也叫一句话函数. 课上练习: # 正常函数: def func(a, b): return a + b print(func(4, 6)) ...

  2. leetcode 263. Ugly Number 、264. Ugly Number II 、313. Super Ugly Number 、204. Count Primes

    263. Ugly Number 注意:1.小于等于0都不属于丑数 2.while循环的判断不是num >= 0, 而是能被2 .3.5整除,即能被整除才去除这些数 class Solution ...

  3. leetcode 344. Reverse String 、541. Reverse String II 、796. Rotate String

    344. Reverse String 最基础的旋转字符串 class Solution { public: void reverseString(vector<char>& s) ...

  4. leetcode 198. House Robber 、 213. House Robber II 、337. House Robber III 、256. Paint House(lintcode 515) 、265. Paint House II(lintcode 516) 、276. Paint Fence(lintcode 514)

    House Robber:不能相邻,求能获得的最大值 House Robber II:不能相邻且第一个和最后一个不能同时取,求能获得的最大值 House Robber III:二叉树下的不能相邻,求能 ...

  5. leetcode 136. Single Number 、 137. Single Number II 、 260. Single Number III(剑指offer40 数组中只出现一次的数字)

    136. Single Number 除了一个数字,其他数字都出现了两遍. 用亦或解决,亦或的特点:1.相同的数结果为0,不同的数结果为1 2.与自己亦或为0,与0亦或为原来的数 class Solu ...

  6. lintcode 787. The Maze 、788. The Maze II 、

    787. The Maze https://www.cnblogs.com/grandyang/p/6381458.html 与number of island不一样,递归的函数返回值是bool,不是 ...

  7. 代码随想录第八天 |344.反转字符串 、541. 反转字符串II、剑指Offer 05.替换空格 、151.翻转字符串里的单词 、剑指Offer58-II.左旋转字符串

    第一题344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这 ...

  8. 【二叉树-所有路经系列(根->叶子)】二叉树的所有路径、路径总和 II、路径总和、求根到叶子节点数字之和(DFS)

    总述 全部用DFS来做 重点一:参数的设置:为Root,路径字符串,路径List集合. 重点二:步骤: 1 节点为null 2 所有节点的操作 3 叶子结点的操作 4 非叶节点的操作 题目257. 二 ...

  9. [LeetCode] #112 #113 #437 Path Sum Series

    首先要说明二叉树的问题就是用递归来做,基本没有其他方法,因为这数据结构基本只能用递归遍历,不要把事情想复杂了. #112 Path Sum 原题链接:https://leetcode.com/prob ...

随机推荐

  1. JAVA对Excel的导入导出

    今天需要对比2个excel表的内容找出相同:由于要学的还很多上手很慢所以在这做个分享希望对初学的有帮助: 先是pom的配置: <dependency> <groupId>org ...

  2. vue按需引入element或mint

    vue按需引入element或mint需要添加 babel-preset-es2015 和babel-plugin-component

  3. 快速排序 java详解

    1.快速排序简介: 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此 ...

  4. Java--实现单点登录

    1 什么是单点登陆 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用 ...

  5. Integer to Boolean strange syntax

    Question: I'm less than a year into C++ development (focused on other languages prior to this) and I ...

  6. java反射与动态代理的理解

    一.什么是反射机制? 反射的官方定义是这样的:在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象 ...

  7. 基于angular2x+ng-bootstrap构建后台管理系统界面

    写在前面的话 近来公司要做一个后台管理系统,人手比较少,于是作为一个前端也参与进来,其实据我所知,大部分的公司还是后台自己捣鼓的. 在后台没有到位的情况下,前端应该使用什么技术也着实让我为难了一把.经 ...

  8. gitlab-ci的注意点

    在使用gitlab搭配gitlab-runner进行ci配置时,发现两个问题,略记如下备忘: 1. 若发现ci job控制台显示无法下载该项目,但当前提交代码人和ci用户都确实具备该项目的访问权限时, ...

  9. 利用奇异值分解(SVD)进行图像压缩-python实现

    首先要声明,图片的算法有很多,如JPEG算法,SVD对图片的压缩可能并不是最佳选择,这里主要说明SVD可以降维 相对于PAC(主成分分析),SVD(奇异值分解)对数据的列和行都进行了降维,左奇异矩阵可 ...

  10. Echarts地图展示及属性分析

    Echarts,一个效果非常棒的可视化库,可以生产各种图表,动态展示,附上官方网址:http://www.echartsjs.com/index.html 之前带本科实习时有同学用过,狗哥的博客也用这 ...