博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Sum of Left Leaves 左子叶之和
阅读量:5973 次
发布时间:2019-06-19

本文共 2500 字,大约阅读时间需要 8 分钟。

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

Example:

3/ \9  20/  \15   7There 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
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
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的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
Spring BOOT 集成 RabbitMq 实战操作(一)
查看>>
安装python3.5注意事项及相关命令
查看>>
进程通信之无名信号量
查看>>
并发串行调用接口
查看>>
C# 视频监控系列 序 [完]
查看>>
Mongodb3.0.5副本集搭建及spring和java连接副本集配置
查看>>
FileStream大文件复制
查看>>
TDD 的本质不是 TDD
查看>>
linux命令学习——ps
查看>>
freemark 判断list是否为空
查看>>
JS的一些扩展:String、StringBuilder、Uri
查看>>
solr的suggest模块
查看>>
2PHP页面缓存
查看>>
编译原理 LL1文法First集算法实现
查看>>
菜鸟学Linux命令:bg fg jobs命令 任务管理
查看>>
python 多线程就这么简单(续)
查看>>
【Linux系统编程】 Linux系统调用概述
查看>>
SQL Server Reporting Services:无法检索应用程序文件。部署中的文件已损坏
查看>>
hive中partition如何使用
查看>>
查看mysql数据库版本方法总结
查看>>