最近头脑有些不清晰
总感觉很多事没做
又不太想去做
不知道该做什么
怎么说
有些懵
没有状态
是时候
该出去浪一波了
哈哈哈哈哈哈哈哈
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例: 给定如下二叉树,以及目标和 sum = 22,
5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返回:
[ [5,4,11,2], [5,8,4,5] ]思路:
这一题就是第112题的进阶版了,第112题只需要我们判断是否存在该路径即可,而此题是需要我们把路径也给找出来,无疑难度增加不少。但其实方法都大同小异,读者对第112题不熟悉的话,可以先看看这篇文章,有个大概印象。
https://blog.csdn.net/weixin_36431280/article/details/90401953
第112题用了两种方法,我也会基于这两种方法给出相应的方法,改动地方不是很多,所以我就不怎么解释了。但是里面用到了动态规划的方法,对于动态规划题目的求解步骤我还专门写了一篇文章,大家可以看看。
https://blog.csdn.net/weixin_36431280/article/details/86616672
方法一:
就是情况最多的那种,代码如下:
class Solution(object): def pathSum(self, root, sum): """ :type root: TreeNode :type sum: int :rtype: List[List[int]] """ # 定义一列表用来保存所有路径 paths = [] def traverse(root, sum, path=[]): if root is None: return if root.left is None and root.right is None: new_path = path+[root.val] if sum == root.val: paths.append(path+[root.val]) elif root.left is None: traverse(root.right, sum-root.val, path+[root.val]) elif root.right is None: traverse(root.left, sum-root.val, path+[root.val]) else: traverse(root.left, sum-root.val, path+[root.val]) traverse(root.right, sum-root.val, path+[root.val]) traverse(root, sum) return paths执行效率还是可以,在94%左右。
方法二:
就是情况比较少的那种,代码如下:
class Solution(object): def pathSum(self, root, sum): """ :type root: TreeNode :type sum: int :rtype: List[List[int]] """ # 定义一列表用来保存所有路径 paths = [] def traverse(root, sum, path=[]): if root is None: return if root.left is None and root.right is None: new_path = path+[root.val] if sum == root.val: paths.append(path+[root.val]) if root.left : traverse(root.left, sum-root.val, path+[root.val]) if root.right: traverse(root.right, sum-root.val, path+[root.val]) traverse(root, sum) return paths执行效率有了进一步提升,在100%