「力扣」第 104 题:求一棵二叉树的最大深度(简单)


「力扣」第 112 题:Path Sum

传送门:112. 路径总和

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

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

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

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

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

分析:给出一棵二叉树以及一个数组 sum,判断在这棵二叉树上是否存在一条从根到叶子结点的路径,这条路径上所有的结点的和为 sum。

下面给出一个很容易想到,但是是个错误的解答。

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

public class Solution {
    public boolean hasPathSum(TreeNode root, int sum) {
        if (root == null) {
            return sum == 0;
        }
        if (root.left != null) {
            return hasPathSum(root.left, sum - root.val);
        }
        if (root.right != null) {
            return hasPathSum(root.right, sum - root.val);
        }
        return false;
    }
}

这样的写法,之所以是错误的,是因为我们没有注意到所求的路径是从根结点到叶子结点的路径,忽略了叶子结点这个条件,为此,我们改写方法如下:

Java 代码:

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

public class Solution {
    public boolean hasPathSum(TreeNode root, int sum) {
        if (root == null) {
            return false;
        }
        // 是叶子结点,这就是递归到底的情况了
        if (root.left == null && root.right == null) {
            return root.val == sum;
        }
        if (hasPathSum(root.left, sum - root.val)) {
            return true;
        }
        if (hasPathSum(root.right, sum - root.val)) {
            return true;
        }
        return false;
    }
}

Python 代码:

# Definition for a binary tree node.
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
# 112. 路径总和
# 给定一个二叉树和一个目标和,判断该树中是否存在根结点到叶子结点的路径,这条路径上所有结点值相加等于目标和。
#
# 说明: 叶子结点是指没有子结点的结点。


class Solution:
    def hasPathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: bool
        """
        if root is None:
            return False
        # 此时 root 不为空
        # 左边看一看,右边看一看
        # 【重点】一定要记得判断,左边子树和右边子树同时为空,说明走到底了
        if root.left is None and root.right is None and root.val == sum:
            return True
        left_has = self.hasPathSum(root.left, sum - root.val)
        right_has = self.hasPathSum(root.right, sum - root.val)
        return left_has or right_has

112 . 路径总和

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

我写的题解地址:

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

Java 代码:

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

public class Solution {
    public boolean hasPathSum(TreeNode root, int sum) {
        if (root == null) {
            return false;
        }
        // 是叶子结点,这就是递归到底的情况了
        if (root.left == null && root.right == null) {
            return root.val == sum;
        }
        if (hasPathSum(root.left, sum - root.val)) {
            return true;
        }
        if (hasPathSum(root.right, sum - root.val)) {
            return true;
        }
        return false;
    }
}

Python 代码:

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


class Solution:
    def hasPathSum(self, root, sum):
        if root is None:
            return False
        # 此时 root 不为空
        # 左边看一看,右边看一看
        # 【重点】一定要记得判断,左边子树和右边子树同时为空,说明走到底了
        if root.left is None and root.right is None and root.val == sum:
            return True
        left_has = self.hasPathSum(root.left, sum - root.val)
        right_has = self.hasPathSum(root.right, sum - root.val)
        return left_has or right_has

LeetCode 第 112 题:Path Sum

Python 代码:

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


class Solution:
    def hasPathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: bool
        """

        if root is None:
            return False

        # 此时 root 不为空
        # 左边看一看,右边看一看
        # 【重点】一定要记得判断,左边子树和右边子树同时为空,说明走到底了
        if root.left is None and root.right is None and root.val == sum:
            return True

        left_has = self.hasPathSum(root.left, sum - root.val)
        right_has = self.hasPathSum(root.right, sum - root.val)
        return left_has or right_has


文章作者: liweiwei1419
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liweiwei1419 !
评论
 上一篇
「力扣」第 129 题:求根到叶子结点数字之和 「力扣」第 129 题:求根到叶子结点数字之和
「力扣」第 129 题:求根到叶子结点数字之和 链接:求根到叶子结点数字之和。 给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。 例如,从根到叶子节点路径 1->2->3 代表
下一篇 
「力扣」第 104 题:求一棵二叉树的最大深度(简单) 「力扣」第 104 题:求一棵二叉树的最大深度(简单)
「力扣」第 111 题:求一棵二叉树的最小深度 中文网址:111. 二叉树的最小深度 ; 英文网址:111. Minimum Depth of Binary Tree , 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节
  目录