20180722剑指offer题25——二叉树中和为某一值的路径

一、要求

    输入一棵二叉树和一个值,求从根结点到叶结点的和等于该值的路径

二、思路及代码

  递归思想,逐层计算各节点往下的sum需要多少,直到叶节点判断val和减剩下的sum是否相等,需要注意的是没有说val就一定大于0,所以分支限界在本题是不存在的。

程序运行过程:向下向下向下——遇到叶子节点——哇,val等于sum,返回该节点值[[val]]/哦,不相等啊,返回个空的[]——返回时在val前加个路径rootnode.val/对于不对的叶子节点的路径,用[rootnode.val]+时自动消失了。

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

def pathSum(rootnode,sum):
    if rootnode==None:
        return False
    if rootnode.left==None and rootnode.right==None:#叶节点
        if rootnode.val==sum:
            return [[rootnode.val]]#这个[[]]一定要,为了之后[a]+[b]
        else:
            return []
    #运行到这里就说明不是叶节点,需要左右发展
    subpath= pathSum(rootnode.left,sum-rootnode.val)+pathSum(rootnode.right,sum-rootnode.val)
    path=[[rootnode.val]+i for i in subpath]#非常重要,不能和上一步合并,分开能抛去一些空的[]
    return path


pNode1 = TreeNode(10)
pNode2 = TreeNode(5)
pNode3 = TreeNode(12)
pNode4 = TreeNode(4)
pNode5 = TreeNode(7)


pNode1.left = pNode2
pNode1.right = pNode3
pNode2.left = pNode4
pNode2.right = pNode5


print(pathSum(pNode1, 22))

三、运行结果

[[10, 5, 7], [10, 12]]

四、思考与总结

功能测试代码:

a=[1,24,4]
b=[2,3,4]
val=1000
c=[a]+[b]
print([[val]+i for i in c])

运行结果:

[[1000, 1, 24, 4], [1000, 2, 3, 4]]

可见:

用[a]+[b],可以实现append和expend不太一样的效果:[[a],[b]]

用[[n]+i for i in A]结果是[[n,A0],[n,A1],...]

猜你喜欢

转载自blog.csdn.net/weixin_41819299/article/details/81154545