• 437. Path Sum III


    题目:

    You are given a binary tree in which each node contains an integer value.

    Find the number of paths that sum to a given value.

    The path does not need to start or end at the root or a leaf, but it must go downwards (traveling only from parent nodes to child nodes).

    The tree has no more than 1,000 nodes and the values are in the range -1,000,000 to 1,000,000.

    Example:

    root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8
    
          10
         /  
        5   -3
       /     
      3   2   11
     /    
    3  -2   1
    
    Return 3. The paths that sum to 8 are:
    
    1.  5 -> 3
    2.  5 -> 2 -> 1
    3. -3 -> 11

    链接:https://leetcode.com/problems/path-sum-iii/#/description

    3/25/2017

    这道题自己想出来了思路,然而不会写后序遍历。。。

    出现的问题:

    1. 不会写iterative的后序遍历:(

    2. Vector不好用,以后刷题也不用了。

    3. 对几种主要的Collections的方法不熟悉

    思路:后序遍历iterative时stack含有从根节点到当前节点的路径。我们用arraylist取代stack,每当有新元素加到stack时从尾到头看和是否为target,是的话+1。一个stack可能有多个符合要求的路径(比如某节点值为0,或几个节点和为0)

    performance 23ms,但是我认为这个应该算是中等题,简单题有点为难我了。

    时间复杂度O(nlgn),worst caseO(n^2)

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     int val;
     5  *     TreeNode left;
     6  *     TreeNode right;
     7  *     TreeNode(int x) { val = x; }
     8  * }
     9  */
    10 public class Solution {
    11     public int pathSum(TreeNode root, int sum) {
    12         ArrayList<TreeNode> v = new ArrayList<TreeNode>();
    13         if (root == null) return 0;
    14         TreeNode prev = null; // previously traversed node
    15         TreeNode curr = root;
    16         int count =0;
    17 
    18         v.add(root);
    19         if (root.val == sum) count++;
    20         
    21         while (!v.isEmpty()) {
    22             curr = v.get(v.size()-1);
    23             if (prev == null || prev.left == curr || prev.right == curr) { // traverse down the tree
    24                 if (curr.left != null) {
    25                     v.add(curr.left);
    26                     count += getCurrentCount(v, sum);
    27                 } else if (curr.right != null) {
    28                     v.add(curr.right);
    29                     count += getCurrentCount(v, sum);
    30                 }
    31             } else if (curr.left == prev) { // traverse up the tree from the left
    32                 if (curr.right != null) {
    33                     v.add(curr.right);
    34                     count += getCurrentCount(v, sum);
    35                 }
    36             } else { // traverse up the tree from the right
    37                 v.remove(v.size()-1);
    38             }
    39             prev = curr;
    40         }
    41         return count;
    42     }
    43     
    44     private int getCurrentCount(ArrayList<TreeNode> v, int sum) {
    45         int count = 0;
    46         int tempSum = 0;
    47         for (int i = v.size() - 1; i >= 0; i--) {
    48             tempSum += v.get(i).val;
    49             if (tempSum == sum) count++;
    50         }
    51         return count;
    52     }
    53 }

    别人用hashmap储存prefix sum,我还没有看懂:

    https://discuss.leetcode.com/topic/64526/17-ms-o-n-java-prefix-sum-method/11

    更简单的recursive写法:

    https://discuss.leetcode.com/topic/64388/simple-ac-java-solution-dfs

    更多讨论

    https://discuss.leetcode.com/category/562/path-sum-iii

  • 相关阅读:
    2.Android之按钮Button和编辑框EditText学习
    《DSP using MATLAB》Problem 3.8
    《DSP using MATLAB》Problem 3.7
    《DSP using MATLAB》Problem 3.6
    《DSP using MATLAB》Problem 3.5
    《DSP using MATLAB》Problem 3.4
    《DSP using MATLAB》Problem 3.3
    《DSP using MATLAB》Problem 3.2
    《DSP using MATLAB》Problem 3.1
    《DSP using MATLAB》Problem 2.20
  • 原文地址:https://www.cnblogs.com/panini/p/6619204.html
Copyright © 2020-2023  润新知