一、要求
输入一棵二叉树和一个值,求从根结点到叶结点的和等于该值的路径
二、思路及代码
递归思想,逐层计算各节点往下的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],...]