Find the sum of all left leaves in a given binary tree.

Example:

3
/ \
9  20
/  \
15   7
There are two left leaves in the binary tree, with values 9 and 15 respectively. Return 24.

这道题让我们求一棵二叉树的所有左子叶的和,那么看到这道题我们知道这肯定是考二叉树的遍历问题,那么最简洁的写法肯定是用递归,由于我们只需要累加左子叶之和,那么我们在进入递归函数的时候需要知道当前结点是否是左子节点,如果是左子节点,而且该左子节点再没有子节点了说明其是左子叶,那么我们将其值加入结果res中,我们用一个bool型的变量,如果为true说明当前结点是左子节点,若为false则说明是右子节点,不做特殊处理,整个来说就是个递归的先序遍历的写法,参见代码如下:

解法一:

class Solution {
public:int sumOfLeftLeaves(TreeNode* root) {if (!root || (!root->left && !root->right)) return 0;int res = 0;helper(root->left, true, res);helper(root->right, false, res);return res;}void helper(TreeNode* node, bool left, int& res) {if (!node) return;if (!node->left && !node->right && left) res += node->val;helper(node->left, true, res);helper(node->right, false, res);}
};

我们还可以写的更简洁一些,不需要写其他的函数,直接在原函数中检查当前节点的左子节点是否是左子叶,如果是的话,则返回左子叶的值加上对当前结点的右子节点调用递归的结果;如果不是的话,我们对左右子节点分别调用递归函数,返回二者之和,参见代码如下:

解法二:

class Solution {
public:int sumOfLeftLeaves(TreeNode* root) {if (!root) return 0;if (root->left && !root->left->left && !root->left->right) {return root->left->val + sumOfLeftLeaves(root->right);}return sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right);}
};

我们也可以使用迭代来解,因为这道题的本质是遍历二叉树,所以我们可以用层序遍历的迭代写法,利用queue来辅助,注意对左子叶的判断和处理,参见代码如下:

解法三:

class Solution {
public:int sumOfLeftLeaves(TreeNode* root) {if (!root || (!root->left && !root->right)) return 0;int res = 0;queue<TreeNode*> q;q.push(root);while (!q.empty()) {TreeNode *t = q.front(); q.pop();if (t->left && !t->left->left && !t->left->right) res += t->left->val;if (t->left) q.push(t->left);if (t->right) q.push(t->right);}return res;}
};

我们也可以用stack来辅助,对比上面的解法,我们发现几乎一模一样,只是把queue换成了stack,但实际上遍历的顺序不同,这种方法是先序遍历的迭代写法,参见代码如下:

解法四:

class Solution {
public:int sumOfLeftLeaves(TreeNode* root) {if (!root || (!root->left && !root->right)) return 0;int res = 0;stack<TreeNode*> s;s.push(root);while (!s.empty()) {TreeNode *t = s.top(); s.pop();if (t->left && !t->left->left && !t->left->right) res += t->left->val;if (t->left) s.push(t->left);if (t->right) s.push(t->right);}return res;}
};

本文转自博客园Grandyang的博客,原文链接:左子叶之和[LeetCode] Sum of Left Leaves ,如需转载请自行联系原博主。

[LeetCode] Sum of Left Leaves 左子叶之和相关推荐

  1. 404. Sum of Left Leaves 左叶子之和

    计算给定二叉树的所有左叶子之和. 示例: 3/ \9 20/ \15 7在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 DFS 判断一下,然后要么加和要么继续DFS. Code d ...

  2. Java描述 LeetCode,404. Sum of Left Leaves 左叶子的节点总和

    大家好,我是河海哥,专注于后端,如果可以的话,想做一名code designer而不是普通的coder,一起见证河海哥的成长,您的评论与赞是我的最大动力,如有错误还请不吝赐教,万分感谢.一起支持原创吧 ...

  3. [Leetcode][第404题][JAVA][左叶子之和][DFS][BFS]

    [问题描述][简单] [解答思路] 1. DFS 递进思想 一步一步递进 /先序遍历求所有节点值之和 public int sumOfTrees(TreeNode root) {if (root == ...

  4. [LeetCode] Sum of Two Integers 两数之和

    Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Exam ...

  5. LeetCode 404. 左叶子之和(Sum of Left Leaves)

    404. 左叶子之和 404. Sum of Left Leaves LeetCode404. Sum of Left Leaves 题目描述 计算给定二叉树的所有左叶子之和. 示例: 3/ \9 2 ...

  6. C#LeetCode刷题之#404-左叶子之和​​​​​​​​​​​​​​(Sum of Left Leaves)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4084 访问. 计算给定二叉树的所有左叶子之和. 3      / ...

  7. LeetCode 404. 左叶子之和(递归)

    1. 题目 计算给定二叉树的所有左叶子之和. 示例:3/ \9 20/ \15 7在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 来源:力扣(LeetCode) 链接:https: ...

  8. [二叉树|深搜|dfs] leetcode 404 左叶子之和

    [二叉树|深搜|dfs] leetcode 404 左叶子之和 1.题目 题目链接 计算给定二叉树的所有左叶子之和. 示例: 3/ \9 20/ \15 7在这个二叉树中,有两个左叶子,分别是 9 和 ...

  9. LeetCode 404左叶子之和-简单

    计算给定二叉树的所有左叶子之和. 示例: 3/ \9 20/ \15 7 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 代码如下: /*** Definition for a b ...

最新文章

  1. 开源吞噬世界,得开发者得天下
  2. STM32时钟配置方法详解
  3. ArcGIS API for Silverlight 点沿着线流动
  4. php expat+DOM+SimpleXML XML读取
  5. php代码实现做网络安全的功能,基于PHP关键词审计技巧?网络安全源代码审计
  6. 【C++】cannot access private member declared in class 'Box'
  7. php课程 6-20 字符串基础和去除空格和字符串填补函数
  8. android edittext换行位置不变,Android EditText使用自动换行但无硬性返回
  9. 为什么使用 adapter模式
  10. 【OpenCV学习笔记】【函数学习】十一(读入图像﹑显示图像和保存图像)
  11. SQL群集多实例卸载、安装
  12. 网站域名服务器 地址查询,查看网站dns域名服务器ip地址查询
  13. Java小白之编写:计算个税的程序
  14. 安全模式删除入网小助手_入网小助手 监控
  15. matlab里面atn是什么意思,matlab教程第一章
  16. 小黑为四川大学实习金融专业同学解决了困扰好久的一个代码小bug,获得成就感,和清华实习同学约饭啦(被请客),继续向前的leetcode之旅:145. 二叉树的后序遍历
  17. C#读取QQWry.Dat文件实现IP查询
  18. 水肥一体化智能灌溉系统
  19. 十次方项目开发系列【8】:对评论点赞功能开发 Redis的配置和使用
  20. css里的padding什么意思,最详细的padding_css padding用法解析

热门文章

  1. Elasticsearch 嵌套类型nested
  2. AgreementMaker:Efficient Matching for Large Real-World 翻译
  3. ElasticSearch.js源码走一个大概
  4. Vendor Prefix:为什么需要浏览器引擎前缀
  5. 开发技巧汇总|对于imag.js你不知道的事
  6. 使用浏览器地址栏调用CXF Webservice的写法
  7. Linux puppet的安装配置部署
  8. PL/SQL中,declare定义变量和variable定义变量的区别?
  9. input 文本框和 img 验证码对齐问题
  10. cocos2d-x常用工具-沈大海cocos2d-x教程23