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

    <递归>

    <return写在最后的理解>

    <逆向思维>

    题目描述


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

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

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

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

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

     

    题解 


    class Solution(object):
        def hasPathSum(self, root, sum):
            """
            :type root: TreeNode
            :type sum: int
            :rtype: bool
            """
            # 出口条件
            if not root:
                return False
    
            #求解子问题,当达到目标值(即目标值削减到0)则返回结果True,否则False
            sum-=root.val
            if not root.left and not root.right:
                return sum==0
            
            # 递归子问题
            ans1 = self.hasPathSum(root.left,sum)
            ans2 = self.hasPathSum(root.right,sum)
    
            # 递归到叶子节点后开始回溯,返回子问题的结果
            return ans1 or ans2

    1. 如何理解回溯的时候写  return ans1 or ans2 呢?

    如果回溯的时候不写 return ,则不会往上一层返回结果。

    如图:

    总结


     

    • 掌握解决子问题的递归写法

    • 逆向思维,累加到目标值 转换为 递减到0

  • 相关阅读:
    thinkphp3.2 无法加载模块
    php 使用 wangeditor3 图片上传
    nginx 配置 server
    oracle练手(一)
    Oracle练习(一)
    java运算符优先级
    数据库(mysql和oracle)
    java实现4种内部排序
    mysql-----分库分表
    NIO总结-----Buffer
  • 原文地址:https://www.cnblogs.com/remly/p/12706035.html
Copyright © 2011-2022 走看看