每日一道算法题--leetcode 113--路径总和II--python

【题目描述】

【代码思路】

可以对比参考我的上一篇每日一道算法题--leetcode 112--路径总和--python,整体思路与上一篇基本相似,不同之处在于要保存好路径在一个list中,在判断该路径是我们要找的路径时,把这个路径list加入到返回结果list中即可。 这里有一点需要注意,对于递归过程,如果递归函数参数是局部变量,比如下面的sum1变量,则在每次递归结束时不需要还原参数,恢复现场。但是如果递归函数的参数是全局变量或者是地址传参,比如下面的list_temp,那么就需要在每次递归结束的时候恢复现场。

注:Python 到了这里,我们就要记住一件事情了,将列表作为参数传入函数中去,那么在函数中任何对于列表的修改是永久性的。举个例子:可见执行函数之后,start这个list已经被改变了,可见用list做函数参数的时候是地址传参,改变了内存单元中的值。

def a(lit):
    lit.append(1)
    
start=[2,2,2]
print("执行函数之前:",start)
a(start)
print("执行函数后:",start) 

结果:
执行函数之前: [2, 2, 2]
执行函数后: [2, 2, 2, 1]

在递归函数中,我加入一个变量,是list_temp用于存储每一条路径的结点,跟sum1一样,每一次执行dfs函数的时候吗,就把这个结点加入到list中即list_temp.append(root.val),在递归函数的最后,对于这个list_temp参数来说,每次都要还原现场,即list_temp.pop()将加入的结点推出,还原成原样。为了证明,我还每次执行都把list_temp的id打印出来,会发现是相同的id,所以需要还原;而我把sum1参数的id打印出来,就会发现,id都不相同,可见就是局部变量,不需要还原。

def dfs(self,root,sum1,list_temp,sum):
    print("sum1:",id(sum1))
    print("list_temp:",id(list_temp))

运行结果证明,id相同,是地址传参。

后面的思路和我的上一篇文章完全一样,不再赘述。

【源代码】

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def pathSum(self, root, sum):
        self.result_list=[]
        if not root:
            return self.result_list
        self.dfs(root,0,[],sum)
        return self.result_list
        """
        :type root: TreeNode
        :type sum: int
        :rtype: List[List[int]]
        """
    def dfs(self,root,sum1,list_temp,sum):
        list_temp.append(root.val)
        if sum1==sum and not root.left and not root.right:
            self.result_list.append(list(list_temp))
        if root.left:
            self.dfs(root.left,sum1+root.val,list_temp,sum)
        if root.right:
            self.dfs(root.right,sum1+root.val,list_temp,sum)
        list_temp.pop()

【递归过程重现】

以这棵树为例子,打印出来递归过程,方便理解。递归函数都是执行完本层才会执行上层。

执行dfs函数: 此时root: 1 此时sum1: 0 此时list_temp: []
加入该root结点之后,list_temp: [1]
左边入栈left: 2
执行dfs函数: 此时root: 2 此时sum1: 1 此时list_temp: [1]
加入该root结点之后,list_temp: [1, 2]
左边入栈left: 4
执行dfs函数: 此时root: 4 此时sum1: 3 此时list_temp: [1, 2]
加入该root结点之后,list_temp: [1, 2, 4]
执行pop,此时dfs: 4 3 [1, 2, 4]
执行完pop的list_temp: [1, 2]
右边入栈right: 6
执行dfs函数: 此时root: 6 此时sum1: 3 此时list_temp: [1, 2]
加入该root结点之后,list_temp: [1, 2, 6]
执行pop,此时dfs: 6 3 [1, 2, 6]
执行完pop的list_temp: [1, 2]
执行pop,此时dfs: 2 1 [1, 2]
执行完pop的list_temp: [1]
右边入栈right: 3
执行dfs函数: 此时root: 3 此时sum1: 1 此时list_temp: [1]
加入该root结点之后,list_temp: [1, 3]
左边入栈left: 11
执行dfs函数: 此时root: 11 此时sum1: 4 此时list_temp: [1, 3]
加入该root结点之后,list_temp: [1, 3, 11]
执行pop,此时dfs: 11 4 [1, 3, 11]
执行完pop的list_temp: [1, 3]
执行pop,此时dfs: 3 1 [1, 3]
执行完pop的list_temp: [1]
执行pop,此时dfs: 1 0 [1]
执行完pop的list_temp: []

本人掘金账号与csdn同步更新,掘金叶欢迎关注!主页地址

猜你喜欢

转载自blog.csdn.net/transformed/article/details/88854821
今日推荐