题目描述

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

说明: 叶子节点是指没有子节点的节点。

示例: 
给定如下二叉树,以及目标和 sum = 22

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

返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2

https://leetcode-cn.com/problems/path-sum/

解法1

这道题采用DFS就可以实现,我们每路过一个节点,就把节点值从sum中减掉,然后传递给节点的左子树/右子树。当遍历到叶子节点时sum为0,就找到了这么一条路径。由于这条路径可能从当前节点“向左走”也可能“向右走”,他们应该取的关系。

需要注意的是,有一个case: node = null, sum = 0,它的答案是false,也就是不存在一条路径使得和为0。我一开始写的代码是这样的:

   // 注意:这是一个错误的示例 
   public boolean hasPathSum(TreeNode root, int sum) {
        if (root == null) {
            return sum == 0;
        }

        return hasPathSum(root.left, sum - root.val) ||
                hasPathSum(root.right, sum - root.val);
    }

如果这么写,对于上面的case会返回true。我们应该在当前节点为叶子结点时,判定sum是否为0,而不是遇到空节点时再判断,这样就能够使得那个case返回false。下面是正确的代码,时间复杂度和空间复杂度都为O(n):

import java.util.ArrayList;
import java.util.List;

class Solution {
    public boolean hasPathSum(TreeNode root, int sum) {
        if (root == null)
            return false;

        sum -= root.val;
        if (root.left == null && root.right == null) {
            return sum == 0;
        }

        return hasPathSum(root.left, sum) ||
                hasPathSum(root.right, sum);
    }
}
pwrliang Algorithms, DFS, Tree

Leave a Reply

Your email address will not be published. Required fields are marked *