zoukankan      html  css  js  c++  java
  • LeetCode 112. 路径总和 | Python

    112. 路径总和


    题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/path-sum

    题目


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

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

    示例:

    给定如下二叉树,以及目标和 sum = 22,
    
                  5
                 / 
                4   8
               /   / 
              11  13  4
             /        
            7    2      1
    

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

    解题思路


    思路:递归、广度优先搜索

    在这里先讲 递归,这个解法的思路是从根节点往下找,找到叶子节点。

    先假设跟节点到当前节点的路径和为 val,那么将问题转变一下,是否能够找到从当前节点到叶子节点的路径和为 sum - val,这符合递归的性质。

    那么也就是说从根节点往下找到叶子节点,如果确定当前节点是叶子节点,那么判断 sum 是否等于当前节点的 val 值即可。如果不是叶子节点,那么将继续向下查找。

    具体的代码实现见【代码实现 # 递归】

    同样的这道题中,我们也可以使用 广度优先搜索 的思路来解决。在这里我们使用队列,存储节点以及根节点到某个节点的路径和。

    以题目所给示例,具体的实现过程如下图所示:

    图解

    具体实现代码见【代码实现 # 广度优先搜索】

    代码实现


    # 递归
    
    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution:
        def hasPathSum(self, root: TreeNode, sum: int) -> bool:
            if not root:
                return False
            if not root.left and not root.right:
                return sum == root.val
            return self.hasPathSum(root.left, sum - root.val) or self.hasPathSum(root.right, sum - root.val)
    
    # 广度优先搜索
    
    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution:
        def hasPathSum(self, root: TreeNode, sum: int) -> bool:
            if not root:
                return False
    
            from collections import deque
    
            # 队列存储节点和路径和        
            queue = deque()
            queue.append((root, root.val))
    
            while queue:
                # 出队,开始搜索
                node, path = queue.popleft()
                # 如果叶子节点,路径和等于目标值时,直接返回 True
                if not node.left and not node.right and path == sum:
                    return True
                if node.left:
                    queue.append((node.left,  path + node.left.val))
                if node.right:
                    queue.append((node.right, path + node.right.val))
            
            return False
    

    实现结果


    递归

    实现结果 | 递归

    广度优先搜索

    实现结果 | 广度优先搜素


    文章原创,欢迎关注点赞。微信公众号《书所集录》同步更新,同样欢迎关注交流。

    qrcode_for_Demon

  • 相关阅读:
    Vue中使用clipboard实现复制功能
    在 Window 关闭时,无法将 Visibility 设置为 Visible,也无法调用 Show、ShowDialog、Close 或 WindowInteropHelper.EnsureHandle。
    iTextSharp 给PDF添加水印
    VS2017登录账户提示升级Edge浏览器的问题
    vue表单中,自动过滤前后空字符,再也不用正则表达式了
    vue中 axios的封装
    vue中 axios的封装
    js实现身份证、手机号加密,加密类型为*
    web前端,传统的jquery与vue结合,开发应用
    推荐系统入门笔记1---基于内容推荐的基础架构
  • 原文地址:https://www.cnblogs.com/yiluolion/p/13263153.html
Copyright © 2011-2022 走看看