二叉树中和为某一值的路径

题目描述:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
解法:
递归,先序遍历,用栈保存路径,遍历到根节点求和,等于expect就保存。
注:始终没有AC,但是就是把牛客网说没通过的测试用例本地跑返回的也是正确结果,牛客网返回的错误结果根本不可能得到。想不明白。
更新:想明白了,因为result为类属性,他在进行测试用例时,只生成一个对象,每次测试都使用同一个对象.FindPath(expectNumber),所以始终在对同一个result进行操作,在第一个测试用例使用后,result已经不为空,所以之后的测试用例始终无法通过。

__author__ = 'Zhang Shuai'
from functools import reduce

class TreeNode:
    def __init__(self, x,left=None,right=None):
        self.val = x
        self.left = left
        self.right = right
class Solution:
    stack = []
    result = []
    def FindPath(self, root, expectNumber):
        if root is None: return self.result
        self.stack.append(root.val)
        print(self.stack)
        sum = reduce(lambda x,y:x+y, self.stack)
        if sum == expectNumber and not (root.left or root.right):
            self.result.append([i for i in self.stack]) #相当于浅拷贝,如果直接append stack的话相当于把引用添加进去。
        self.FindPath(root.left, expectNumber)
        self.FindPath(root.right,  expectNumber)
        self.stack.pop(-1)
        return self.result

root = TreeNode(10,TreeNode(5,TreeNode(4),TreeNode(7)),TreeNode(12))
print(Solution().FindPath(root,15))

解决方法:
使用一个新的函数进行包装,当然也可以再返回的时候把result的复制一个新的list(浅拷贝),然后令list为[]

__author__ = 'Zhang Shuai'
from functools import reduce

class Solution:
    def FindPath(self, root, expectNumber):
        stack = []
        result = []
        if root is None: return result
        return self.findpath(stack,result,root,expectNumber)

    def findpath(self,stack,result, root, expectNumber):
        if root is None: return
        stack.append(root.val)
        print(stack)
        sum_result = reduce(lambda x, y: x + y, stack)
        if sum_result == expectNumber and root.left is None and root.right is None:
            result.append([i for i in stack])
        self.findpath(stack,result,root.left, expectNumber)
        self.findpath(stack,result,root.right, expectNumber)
        stack.pop()
        return result
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值