zoukankan      html  css  js  c++  java
  • [Leetcode 11] 112 Path Sum

    Problem:

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.

    For example:
    Given the below binary tree and sum = 22,

                  5
                 / \
                4   8
               /   / \
              11  13  4
             /  \      \
            7    2      1
    

    return true, as there exist a root-to-leaf path 5->4->11->2 which sum is 22.

    Analysis:

    Basically, it's a depth first search problem. We need to enumerate all the possible path sums to check whether there's one path equals to the given sum. We use recursion to solve this problem. If one node's left and right children are all null, we know we reach the end of a path, then we need to test whether this path sum equals to the given value. If equals, we return true immediately. If not, we return false immediately. Then if there's at least one child of the current node is not null, we are in the middle of a path. If only one child, we just consider the sum of this child's path. If two children, we take the "or" result of the two path sums. By using this recursion, we can judge the whether there's one legal path in the given tree.

    One thing need to notice is that, the judge sum condition can't be delayed to the node is null, saying "if (node == null) then ...". This judgement is wrong because there is the case that a node has only one child, then the other is null. And given this null, the programm thinks it reaches a path's end while actually this is not the legal path. A simple case is given below:

      1

    2

    and the sum is 1. The actual result is false while the above method will return true;

    Code:

    View Code
     1 /**
     2  * Definition for binary tree
     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 boolean hasPathSum(TreeNode root, int sum) {
    12         // Start typing your Java solution below
    13         // DO NOT write main() function
    14         if (root == null) 
    15             return false;
    16         else
    17             return pathSum(root, 0, sum);
    18     }
    19     
    20     private boolean pathSum(TreeNode node, int pathsum, int sum) {
    21         int s = pathsum + node.val;
    22         
    23         if (node.left == null && node.right == null) {
    24             if (s == sum)
    25                 return true;
    26             else
    27                 return false; //do nothing
    28         } else
    29         if (node.left != null && node.right == null) {
    30             return pathSum(node.left, s, sum);
    31         } else if (node.left == null && node.right != null) {
    32             return (pathSum(node.right, s, sum));
    33         } else { //both not null
    34             return (pathSum(node.right, s, sum) || pathSum(node.left, s, sum));
    35         } 
    36     }
    37     
    38 }

    Attention:

    Learn how to DFS over a tree!

  • 相关阅读:
    从 Objective-C 里的 Alloc 和 AllocWithZone 谈起
    设计模式(26)
    iOS目录结构
    IOS didReceiveMemoryWarning 的那些事
    iOS多线程编程:线程同步总结
    我要进大厂之大数据Hadoop HDFS知识点(2)
    我要进大厂之大数据Hadoop HDFS知识点(1)
    我要进大厂之大数据ZooKeeper知识点(2)
    我要进大厂之大数据ZooKeeper知识点(1)
    rabbitmq使用延迟时报异常
  • 原文地址:https://www.cnblogs.com/freeneng/p/3012088.html
Copyright © 2011-2022 走看看