Binary Tree Path Sum II

update Jul 14, 2017 20:14

lintcodearrow-up-right

Your are given a binary tree in which each node contains a value. Design an algorithm to get all paths which sum to a given value. The path does not need to start or end at the root or a leaf, but it must go in a straight line down.

Example

      Given a binary tree:

              1
             / \
            2   3
           /   /
          4   2
      for target = 6, return

          [
            [2, 4],
            [1, 3, 2]
          ]

Basic Idea:

这道题和leetcode上的 Path Sum IIIarrow-up-right 其实很接近,但是这道题更加要求输出所有的路径。在前面的那篇文章中我们使用了两个函数两层递归的方式,但是这样的方法相对复杂。学习了九章算法之后,我发现我们可以使用一种更加通用而且易于理解的方法:

整个代码的框架是一个求所有path并返回的程序,只是在我们到达每个node之后,对当前的path进行一次循环,考虑所有在当前位置结束的path,如果 sum == target ,则将这一段path加入res。具体地,对于Java,我们可以用 res.add(new ArrayList<Integer>(path.subList(i, path.size()))) , 在Python中更加方便,直接res.append(path[i:])

Java Code:

Python Code:

update Dec 21, 2017 23:36

Update

时隔数月,发现之前的写法其实并没有领会九章算法所授的分治法的道理。在这里重新写了一个新方法的 Java solution。

在这次的写法中,严格按照九章分治法的思路,对于一个关于root的问题,我们将其化解为一个关于 root.leftroot.right 的同样的问题,再利用左右的返回值求出关于 root 的解。

具体地,我们通过左右子树递归的返回值得到从 左右节点 出发向下的所有路径,然后在每个这种路径的前面都加上 root.val,再加上一个只含有 root.val 的路径,我们就得到了从 root 开始向下的所有路径。这样就完成了一个分治算法。在得到从root开始向下的所有路径之后,我们循环判断这些路径中是否有满足条件的,若有,则将其副本加入 res;

update Feb 19 2019, 17:27

Update: 最直观的解

重做此题,感觉最直观最简单的解法任然是从上到下传一个path数组,每一层先用两层for loop计算有多少从上到下且以当前node截止的满足条件的path,加入res。

Last updated