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

  示例:

  3

  / \

  9 20

  / \

  15 7

  在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 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:郑州哪家人流医院好 http://www.gz020zj.com/

  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遍历,遍历到左叶子节点就加上去。

最新文章

  1. 操作系统 页面置换算法LRU和FIFO
  2. 【转】struct和typedef struct
  3. raphael画图
  4. 帝国cms在任意位置调用指定id的栏目名称和链接
  5. Arcgis Server ecp(许可)
  6. class Core<T> where T : class, new() 求解
  7. 恶补ASP.NET基础【1】委托
  8. INPUT[type=file]的change事件不触发问题
  9. windows phone 7 通过麦克风录音,并且播放
  10. 使用Xamarin在Visual Studio中开发Android应用
  11. spring mvc 控制器方法传递一些经验对象的数组
  12. CSS3学习系列之盒样式(一)
  13. .Net Core 2.0 EntityFrameworkCore CodeFirst入门教程
  14. 企业面试必会shell
  15. [十六]基础类型BigInteger简介
  16. 提高GitHub下载速度
  17. nginx之快速查找配置文件
  18. Luogu1137 旅行计划(拓扑排序)
  19. Redis的主从复制的原理介绍
  20. docker安装优化

热门文章

  1. 【mysql】pymysql.err.InterfaceError Interface Error: (0, '')
  2. springboot + shiro + mysql + mybatis 工程快速搭建
  3. -bash: /home/java/jdk1.8.0_221/bin/java: 权限不够
  4. fiddler---Fiddler接口测试
  5. [排序][链表]Leetcode147 对链表进行插入排序
  6. vue之tab切换
  7. 4.Java基础_Java类型转换
  8. 如何在Windows系统上基于Sublime搭建Python的编译环境
  9. tensorboard运行使用(排坑)记录一
  10. layui实现分页