题目
找到左叶子
方法一:递归
- 判断根节点是否有左子树,用sum_left记录
- 递归左子树与右子树,找出其中的叶子节点
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def sumOfLeftLeaves(self, root: TreeNode) -> int:
sum_left = 0
if not root:
return 0
if root.left and not (root.left.left or root.left.right):# 是否为左叶子节点
sum_left = root.left.val
return sum_left + self.sumOfLeftLeaves(root.left) + self.sumOfLeftLeaves(root.right)
方法二 栈
- 求出所有叶子点的和
- 减去右叶子节点的和
在通过栈遍历的基础上修改的
# Definition for a binary tree node.
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def sumOfLeftLeaves(self, root: TreeNode) -> int:
if not root:
return 0
sum_left = 0
stack = []
last_visit = root
while root or stack:
while root:
# print(root.val)# 先序
stack.append(root)
root = root.left
root = stack[-1]
if root.right != last_visit:
# print(root.val)# 中序
root = root.right
if root and not (root.left or root.right):# 所有右叶子节点的和
sum_left -= root.val
if not root:
last_visit = None
else:
temp = stack.pop()
if not (temp.left or temp.right):# 这里加的是所有叶子节点的和
sum_left += root.val
# print(temp.val)# 后序
last_visit = temp
root = None
return sum_left