Binary Tree Path Sum III

update Aug 28, 2017 23:13

LintCodearrow-up-right

Give a binary tree, and a target number, find all path that the sum of nodes equal to target, the path could be start and end at any node in the tree.

Example

      // Definition of ParentTreeNode:
      class ParentTreeNode {
          public int val;
          public ParentTreeNode parent, left, right;
      }
Given binary tree:

      1
     / \
    2   3
   /
  4
and target = 6. Return :

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

Basic Idea:

这道题目在LintCode中标记为hard,ladder only,在 leetcode 中不曾出现,难度比较高,但是或许在面试中并不多见;

解题的基本思路是,对于每个node,我们考虑他往左的所有路径和往右的所有路径,然后将两组路径两两配对,检查sum是否等于target;

为了完成这个目的,我们可以写一个helper function, 功能如下:

  • 接收一个TreeNode root,返回该node往下的所有路径,例如前面example中的树,输入root,返回[[1],[1,2],[1,2,4],[1,3]];

  • 在函数内部,我们得到了左右两子树的所有路径之后,把root.val放在中间,两边的两组路径两两配对,把符合条件的路径加入res;

时间复杂度应该是 O(N^2 * logN),因为一颗二叉树所有路径个数为 C(N, 2) (因为树种任意两个node之间有且只有一条路径),我们如上算法中考察了所有路径, 而路径长度为 O(logN);

Python Code:

实现起来的确非常麻烦,如果用Java的话会很复杂;

update Dec 22, 2017 0:27

Update

之前写这道题目的时候,没有注意到这是一个 parentTree,每个 node 除了 left 和 right 之外还有一个parent指针。这样就保证了我们可以从树中的任意一点出发到达另外任意一点,于是我们可以把这棵树当做一个无向连通图,这样题目就变成了在一个图中找到所有 sum 为 target 的路径。我们可以用 dfs 从每个 node 出发,搜索所有其他的 node,记录path,当 path sum == target 的时候,将 path 的副本加入 res。

这个做法的时间复杂度为 O(n^2):   因为在二叉树中任意两点间有且只有一条 path,我们的算法从每个点出发找到其他所有点,故总的时间复杂度为 O(n^2);

这种实现方法比之前的不利用parent的要容易了很多,基本上变成了一个简单的图的dfs。

Java Code: