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!

  • 相关阅读:
    [vp]ARC068
    [vp]ARC067
    Vision transformer
    rosetta使用silent格式储存PDB结构,节省本地存储
    CentOS7下安装JDK详细过程
    jdk下载Oracle共享账号
    虚拟机地址发生变化
    字节跳动面试题,给你一个每一项都是数值混乱顺序的数组,只要里面正确顺序的值输出。如[5,1,3,6,2,7],只要[1,2,7]
    spring boot web 第一个项目新建
    xmind-excel
  • 原文地址:https://www.cnblogs.com/freeneng/p/3012088.html
Copyright © 2011-2022 走看看