python每日练习Day30
题目描述:
112. 路径总和
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
说明
叶子节点是指没有子节点的节点。
示例
给定如下二叉树,以及目标和 sum = 22
,
5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1
返回 true
, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2
。
题解
https://leetcode-cn.com/problems/path-sum/solution/lu-jing-zong-he-by-leetcode-solution/
方法一:DFS:广度搜索
方法二:递归
python代码
1 # Definition for a binary tree node. 2 # class TreeNode: 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 8 class Solution: 9 def hasPathSum(self, root: TreeNode, sum: int) -> bool: 10 # #树使用的是双向链表 11 # #如果根节点为空,直接返回False 12 # if not root: 13 # return False 14 15 # #依次遍历根节点,直到叶子节点:判定叶子节点的办法:左叶子的孩子和右叶子的孩子均为None 16 # que_node = collections.deque([root]) 17 # que_val_sum = collections.deque([root.val]) 18 # while que_node: 19 # node = que_node.popleft() #从队列中取出第一个节点 20 # node_val = que_val_sum.popleft() #取出第一个节点的元素 21 # if not node.left and not node.right: 22 # if node_val == sum: 23 # return True 24 # continue 25 # #如果该节点左叶子存在,那么将左叶子直接加入队列中; 26 # #计算该节点的元素与孩子节点的值的和 27 # if node.left: 28 # que_node.append(node.left) 29 # que_val_sum.append(node.left.val + node_val) 30 # #同理左节点 31 # if node.right: 32 # que_node.append(node.right) 33 # que_val_sum.append(node.right.val + node_val) 34 # return False 35 36 #采用递归的方法 37 #如果该节点是叶子节点,那么直接判断与sum的关系 38 if not root: 39 return False 40 if not root.left and not root.right: 41 return root.val == sum 42 return self.hasPathSum(root.left,sum - root.val) or self.hasPathSum(root.right,sum - root.val)
题目来源:https://leetcode-cn.com/problems/path-sum/