问题

给出一棵二叉树及一个和值,检查该树是否存在一条根到叶子的路径,该路径经过的所有节点值的和等于给出的和值。

例如,

给出以下二叉树及和值22:

5
        / \
       4  8
      /   / \
    11 13 4
    / \        \
  7   2        1

函数返回true,因为存在一条根到叶子的路径5->4->11->2,其路径和为22。

初始思路

鉴于题目要求找到一条路径和符合要求即可,选择层次遍历二叉树是一种比较合适的选择-保证了我们首先找到的是最短的路径从而节省了时间。另外由于没有禁止修改原二叉树的值,我们在处理过程中可以把每个点的值修改为到达这点时的路径和,方便比较。至于层次遍历的方法,大家应该已经很熟悉了,使用116,117中的双vector法即可:

 class Solution {
public:
bool hasPathSum(TreeNode *root, int sum)
{
if(!root)
{
return false;
} treeLevel_[].clear();
treeLevel_[].clear(); bool flag = false;
treeLevel_[].push_back(root); while(!treeLevel_[flag].empty())
{
for(auto iter = treeLevel_[flag].begin(); iter != treeLevel_[flag].end(); ++iter)
{
if(!(*iter)->left && !(*iter)->right)
{
if((*iter)->val == sum)
{
return true;
}
} if((*iter)->left)
{
(*iter)->left->val += (*iter)->val; treeLevel_[!flag].push_back((*iter)->left);
} if((*iter)->right)
{
(*iter)->right->val += (*iter)->val; treeLevel_[!flag].push_back((*iter)->right);
}
} treeLevel_[flag].clear(); flag = !flag;
} return false;
} private: std::vector<TreeNode*> treeLevel_[];
};

hasPathSum

提交后Judge Small和Judge Large双双通过。

扩展问题

给出一棵二叉树及一个和值,找出符合条件的所有根到叶子的路径,这些路径经过的所有节点值的和等于给出的和值。

例如,

给出以下二叉树及和值22:


        / \
       4  8
      /   / \
    11 13 4
    / \     / \
  7   2  5    1

返回

[
  [5,4,11,2],
  [5,8,4,5]
]

扩展问题初始思路

题目要求找出所有符合条件的路径,意味着不管用什么方法都必须把所有节点遍历一遍。如果还是使用前面的层次遍历,因为是广度优先遍历,需要同时跟踪多条路径的和,直到走到叶子节点。因此在这里我们尝试使用普通的递归中序遍历,由于这是一种深度优先遍历,通过进栈及出栈操作,可以做到一次只需跟踪一条路径即可:

 class Solution113 {
public:
std::vector<std::vector<int> > pathSum(TreeNode *root, int sum)
{
result_.clear();
if(!root)
{
return result_;
} currentPath_.clear();
currentPath_.push_back(root->val);
sum_ = sum;
currentSum_ = root->val; FindPathSum(root); return result_;
} private: void FindPathSum(TreeNode *node)
{
if(!node->left && !node->right)
{
if(currentSum_ == sum_)
{
result_.push_back(currentPath_);
} return;
} if(node->left)
{
currentSum_ += node->left->val;
currentPath_.push_back(node->left->val);
FindPathSum(node->left);
currentSum_ -= node->left->val;
currentPath_.pop_back();
} if(node->right)
{
currentSum_ += node->right->val;
currentPath_.push_back(node->right->val);
FindPathSum(node->right);
currentSum_ -= node->right->val;
currentPath_.pop_back();
} } std::vector<std::vector<int> > result_;
std::vector<int> currentPath_;
int sum_;
int currentSum_; };

pathSum

提交后同样Judge Small和Judge Large双双通过。

[LeetCode 112 113] - 路径和I & II (Path Sum I & II)的更多相关文章

  1. Leetcode之动态规划(DP)专题-64. 最小路径和(Minimum Path Sum)

    Leetcode之动态规划(DP)专题-64. 最小路径和(Minimum Path Sum) 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. ...

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

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

  3. 【LeetCode】113. 路径总和 II

    题目 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 sum = 22, 5 / \ ...

  4. LeetCode:Path Sum I II

    LeetCode:Path Sum Given a binary tree and a sum, determine if the tree has a root-to-leaf path such ...

  5. [Leetcode][JAVA] Path Sum I && II

    Path Sum Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that addi ...

  6. leetcode -day17 Path Sum I II &amp; Flatten Binary Tree to Linked List &amp; Minimum Depth of Binary Tree

    1.  Path Sum Given a binary tree and a sum, determine if the tree has a root-to-leaf path such tha ...

  7. LeetCode(124) Binary Tree Maximum Path Sum

    题目 Given a binary tree, find the maximum path sum. For this problem, a path is defined as any sequen ...

  8. Path Sum I && II & III

    Path Sum I Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that ad ...

  9. Path Sum I&&II

      I Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up ...

随机推荐

  1. Tomcat部署问题及解决方法

    1.gradle构建web时报错:Access restriction: The type JPEGImageEncoder is not accessible due to restriction ...

  2. escape encodeURI encodeURIComponent区别

    escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串.使用unescape来解码. 有效的URI(统一资源标示符)是不能包含某些字符的,如空格,所以需要进行编码,编码方法有 ...

  3. fsck 修复ext3文件系统(用于linux系统时间不对,文件系统信息有错引起的die with exit status等的一些问题)

    有时候我们用虚拟机装了linux,可是我们做开发的人员,系统时间可能出于一些特殊要求调整过(例如保持一些特殊软件不过期,需要锁定时间等等),这样linux的系统时间久不准了,如果时间不准,会造成ext ...

  4. mysql数据库sql常用命令

    1.查看索引:mysql> show index from tblname; 2.利用索引查询:SELECT * FROM product WHERE ID > =(select id f ...

  5. 循序渐进DB2(第2版)——DBA系统管理、运维与应用案例

    <循序渐进DB2(第2版)——DBA系统管理.运维与应用案例> 基本信息 作者: 牛新庄    出版社:清华大学出版社 ISBN:9787302323013 上架时间:2013-7-3 出 ...

  6. hdu 4499 Cannon(暴力)

    题目链接:hdu 4499 Cannon 题目大意:给出一个n*m的棋盘,上面已经存在了k个棋子,给出棋子的位置,然后求能够在这种棋盘上放多少个炮,要求后放置上去的炮相互之间不能攻击. 解题思路:枚举 ...

  7. web服务交互中HTTP数据内容GZIP,ZLIB格式压缩与解压缩封装(共享)

    点击下载独立的dll //dll内部封装API格式 //gzip BOOL fnZlibDecompressPacket (__IN_PARAM unsigned char* gZlibDataBuf ...

  8. [Javascript] Advanced Reduce: Additional Reducer Arguments

    Sometimes we need to turn arrays into new values in ways that can't be done purely by passing an acc ...

  9. 最全的C#图片处理帮助类ImageHelper

    最全的C#图片处理帮助类ImageHelper.cs 方法介绍: 生成缩略图 图片水印处理方法 图片水印位置处理方法 文字水印处理方法 文字水印位置的方法 调整光暗 反色处理 浮雕处理 拉伸图片 滤色 ...

  10. Oracle按用户进行统计信息更新

    按用户进行统计信息更新 PL/sqldev工具使用system用户连接到oracle,打开命令窗口执行以下SQL,用户名请根据实际情况进行更改: begin dbms_stats.gather_sch ...