题目:求和路径
给定一棵二叉树,其中每个节点都含有一个整数数量(该值或正或负)。设计一个算法,打印节点数值总和等于某个给定值的所有路径(求路径数量!)。注意,路径不一定非得从二叉树得根节点或叶节点开始或结束,但是某方向必须向下(只能从父节点指向子节点方向)。
一、思路
1.先用蛮力法解决,只需要查看所有可能得路径。遍历每个节点,用递归法尝试所有向下的路径。并随着递归的进行跟踪路径的和。每当发现路径和等于目标和,答案就+1;用时O(NlogN) 每个点遍历完需要LogN。
2.尝试在蛮力法上优化,蛮力法有很多重复计算。对于像10→5→3→-2这样的路径,遍历10为起点时 5,3,-2会被遍历,遍历5为起点时 3,-2会被遍历,所有3,-2会被重复遍历,理想情况下,我们希望能够对该过程进行重用。
假设,对于数组(10,5,1,2,-1,-1,7,1,2)中,有多少连续的子序列相加等于目标和,比如8.
我们可以转换问题求解,对于每个元素y,我们试图找到符合下面描述的x的值?
如果数组中的每个元素都知道路径的行程和,那么求解问题就容易很多,只需要使用如下的等式,即 r u n n i n g S u m x = r u n n i n g S u m y − t a r g e t S u m runningSum_x =runningSum_y - targetSum runningSumx=runningSumy−targetSum 。之后,我们只需要找出满足此公式的x的值即可。
建立一个键为 r u n n i n g S u m runningSum runningSum,其值为 r u n n i n g S u m runningSum ru