计算给定二叉树的所有左叶子之和。

示例:

/ \

9 20

/ \

15 7

,所以返回 24

解析

我们需要找到这样的节点

属于叶子节点

属于父节点的左子节点

方法一:用栈,dfs遍历,用全局变量res作为累积和。遍历的过程中传递该节点是否是左子节点。同时判断左右子节点是否为None,则可以知道是不是左叶子节点。

class Solution:

def sumOfLeftLeaves(self, root: TreeNode) -> int:

stack = []

res = 0

if not root:

return res

stack.append((root, 0))

while len(stack) != 0:

p, flag = stack.pop()

if flag == 1:

if p.left == p.right == None:

res += p.val

if p.right:

stack.append((p.right, 0))

if p.left:

stack.append((p.left, 1))

return res

方法二,用递归遍历。遍历到左叶子节点则加上左叶子节点的值。

class Solution:

def sumOfLeftLeaves(self, root: TreeNode) -> int:

self.res = 0

def walk(p):

if p:

if p.left:

if p.left.left == p.left.right == None:

self.res += p.left.val

walk(p.left)

if p.right:

walk(p.right)

walk(root)

return self.res

方法三, 仍是递归,没有使用全局变量。而是使用在递归函数内部累积的方式(即有返回值)。遍历到左叶子节点,则返回值就在此基础上加上右节点的遍历。

class Solution:

def sumOfLeftLeaves(self, root: TreeNode) -> int:

if root == None:

return 0

res = 0

if root.left:

if root.left.left == root.left.right == None:

res += root.left.val

return res + self.sumOfLeftLeaves(root.left) + self.sumOfLeftLeaves(root.right)

方法四,在外汇返佣的过程中,用一个形参记录该节点是否为左孩子点。和用stack遍历类似。

class Solution:

def sumOfLeftLeaves(self, root: TreeNode) -> int:

def cal(p, dir):

if not p:

return 0

if p.left == p.right == None:

if dir == 1:

return p.val

else:

pass

return cal(p.left, 1) + cal(p.right, 0)

return cal(root, 0)

方法五,当然还能用bfs遍历,遍历到左叶子节点就加上去。

/**

* 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:

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);

}

};

class TreeNode {

int val;

TreeNode left;

TreeNode right;

TreeNode(int x) {

val = x;

}

}

class Solution {

public int getLeafCount(TreeNode root) {

if (root == null) {

return 0;

}

if (root.left == null && root.right == null) {

// 输出叶子节点

System.out.println("leaf nodes:" + root.val);

return 1;

}

return getLeafCount(root.left) + getLeafCount(root.right);

}

}

public class Test {

public static void main(String[] args) {

Solution tree = new Solution();

/* create a tree */

TreeNode root = new TreeNode(3);

root.left = new TreeNode(9);

root.right = new TreeNode(20);

root.right.left = new TreeNode(15);

root.right.right = new TreeNode(7);

System.out.println(tree.getLeafCount(root));

}

}

LC: 404.左叶子节点的更多相关文章

  1. LeetCode: 404.左叶子节点

    计算给定二叉树的所有左叶子之和. 示例: 3 / \ 9 20 / \ 15 7 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 解析 我们需要找到这样的节点 属于叶子节点 属于父 ...

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

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

  3. 【LeetCode】404. 左叶子之和

    404. 左叶子之和 知识点:二叉树 题目描述 计算给定二叉树的所有左叶子之和.. 示例 3 / \ 9 20 / \ 15 7 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 解 ...

  4. Java实现 LeetCode 404 左叶子之和

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

  5. [LeetCode]404. 左叶子之和(递归)、938. 二叉搜索树的范围和(递归)(BST)

    题目 404. 左叶子之和 如题 题解 类似树的遍历的递归 注意一定要是叶子结点 代码 class Solution { public int sumOfLeftLeaves(TreeNode roo ...

  6. 左叶子之和(sum-of-left-leaves)

    LeetCode题目--左叶子之和(sum-of-left-leaves) 计算给定二叉树的所有左叶子之和. 示例: 3 / \ 9 20 / \ 15 7 在这个二叉树中,有两个左叶子,分别是 9 ...

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

    [抄题]: Find the sum of all left leaves in a given binary tree. Example: 3 / \ 9 20 / \ 15 7 There are ...

  8. 【原】无脑操作:EasyUI Tree实现左键只选择叶子节点、右键浮动菜单实现增删改

    Easyui中的Tree组件使用频率颇高,经常遇到的需求如下: 1.在树形结构上,只有叶子节点才能被选中,其他节点不能被选中: 2.在叶子节点上右键出现浮动菜单实现新增.删除.修改操作: 3.在非叶子 ...

  9. jquery zTree 查找所有的叶子节点

    jquery zTree 查找所有的叶子节点 // 保存所有叶子节点 10 为初始化大小,并非数组上限 var arrayObj = new Array([10]); /* treeNode: 根节点 ...

随机推荐

  1. sql语句中判断空值的函数

    COALESCE()函数 主流数据库系统都支持COALESCE()函数,这个函数主要用来进行空值处理,其参数格式如下:  COALESCE ( expression,value1,value2……,v ...

  2. Using If/Truth Statements with pandas

    pandas follows the numpy convention of raising an error when you try to convert something to a bool. ...

  3. .NET Core 通过 Ef Core 操作 Mysql

    1.运行环境 开发工具:Visual Studio 2017 JDK版本:.NET Core 2.0 项目管理工具:nuget 2.GITHUB地址 https://github.com/nbfujx ...

  4. iis7反向代理

    很多站长通常在Linux系统下使用nginx作为前端server,通过反向代理间接访问其他webserver.那么如果用户安装的是Windows系统的话,又改如何实现反向代理的设置呢?搜索引擎大全 下 ...

  5. 容器————vector

    目录 一.介绍 二.声明及初始化 三.方法 front find remove erase substr 一.介绍 向量 vector 是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为 ...

  6. HTTP的FormData和Payload的传输格式

    FormData和Payload是浏览器传输给接口的两种格式,这两种方式浏览器是通过Content-Type来进行区分的(了解Content-Type),如果是 application/x-www-f ...

  7. 2018-2019-20175203 实验二 《Java面向对象程序设计》

    2018-2019-20175203 实验二 <Java面向对象程序设计>实验报告 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑 ...

  8. Mac上VMWare Fusion配置多台cent os

    一.创建虚拟机(准备工作) 1.使用VMWare Fusion 创建第一台虚拟机 2.选择操作系统(本次使用的是使用cent os 6.5 64bit 系统) 3.选择磁盘大小(楼主mac上的磁盘大小 ...

  9. Toposort(拓扑排序)dfs递归模板

    最近刷了几题拓扑排序的题,记录一下拓扑排序 在有向图中,并且按照一定的规则(题目所给的规则)排序.如果图中出现了有向环的话就无法排序了. int gap[maxn][maxn];//记录下有向边 in ...

  10. 如何为mysql建立索引

    前些时候,一位颇高级的程序员居然问我什么叫做索引,令我感到十分的惊奇,我想这绝不会是沧海一粟,因为有成千上万的开发者(可能大部分是使用MySQL的)都没有受过有关数据库的正规培训,尽管他们都为客户做过 ...