Python实现"路径总和"的三种方法

本文探讨了如何判断一棵二叉树中是否存在从根节点到叶子节点的路径,其节点值之和等于给定的数。提供了三种方法:递归、求所有路径和及迭代,并附带Python实现。

给定一棵二叉树和一个总数,判断树中是否存在从根结点到叶子节点的累加值等于该给定的总数

注意:叶子节点没有子树

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.

1:递归,从最左边的路径开始,一旦满足要求就返回True

class Solution(object):
    def hasPathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: bool
        """
        if not root:
            return False
        return self.recursionEachPath(root, 0, sum)
        
    def recursionEachPath(self, node, curSum, sum):
        if not node:
            return curSum==sum
        if not node.left and node.right is not None:
            return self.recursionEachPath(node.right, curSum+node.val, sum)
        if node.left is not None and not node.right:
            return self.recursionEachPath(node.left, curSum+node.val, sum)
        left = self.recursionEachPath(node.left, curSum+node.val, sum)
        right = self.recursionEachPath(node.right, curSum+node.val, sum)
        return left or right

该方法优化之后的代码为(参考他人代码):

def hasPathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: bool
        """
        if not root:
            return False
        if not root.left and not root.right:
            return root.val==sum
        if not root.right:
            return self.hasPathSum(root.left, sum-root.val)
        if not root.left:
            return self.hasPathSum(root.right, sum-root.val)
        return self.hasPathSum(root.right, sum-root.val) or self.hasPathSum(root.left, sum-root.val)

 2:先找到所有路径的各自总和,然后判断给定的总和是否存在

class Solution(object):
    def hasPathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: bool
        """
        if not root:
            return False
        if sum in self.allPathesSum(root):
            return True
        else:
            return False
    def allPathesSum(self, root):
        if not root.left and not root.right:   #递归结束的标志
            return [root.val]
        elif not root.right:
            tempList = self.allPathesSum(root.left)
        elif not root.left:
            tempList = self.allPathesSum(root.right)
        else:
            left = self.allPathesSum(root.left)
            right = self.allPathesSum(root.right)
            tempList = left + right
        for i in range(len(tempList)):     #累加该结点的值
                tempList[i] += root.val
        return tempList

3:迭代

def hasPathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: bool
        """
        if not root:
            return False
        allPathesSum = [[root,root.val]]
        while allPathesSum:
            curNode = allPathesSum.pop()
            if not curNode[0].left and not curNode[0].right:
                if curNode[1]==sum:
                    return True
            elif not curNode[0].left:
                allPathesSum.insert(0,[curNode[0].right,curNode[0].right.val+curNode[1]])
            elif not curNode[0].right:
                allPathesSum.insert(0,[curNode[0].left,curNode[0].left.val+curNode[1]])
            else:
                allPathesSum.insert(0,[curNode[0].left,curNode[0].left.val+curNode[1]])
                allPathesSum.insert(0,[curNode[0].right,curNode[0].right.val+curNode[1]])
        return False

算法题来自:https://leetcode-cn.com/problems/path-sum/description/

<think>好的,我现在需要解决用户的问题:“使用Python实现输入两个数字计算两数之和”。首先,我得理解用户的需求。用户可能刚开始学习Python,或者需要完成一个简单的编程任务。这个问题看起来基础,但作为新手,他们可能希望得到详细的指导,包括输入处理、类型转换、计算和输出。 首先,我得考虑如何获取用户输入。Python中使用input()函数来接收输入,但输入的是字符串类型,需要转换成数字,可能是整数或浮点数。所以需要提醒用户注意类型转换,否则直接相加会导致字符串拼接而不是数值相加。例如,输入3和5,如果没转换的话会变成'3'+'5'='35',而不是8。 接下来,如何处理多个输入?用户可能有两种方式输入:一行输入两个数字,用空格分隔,或者分两次输入。需要给出两种情况的示例代码吗?或者选择一种更常见的方式?通常,可能分两次输入更直观,但一行输入可能更高效。这里可能需要给出两种方法,或者选择其中一种简单的方式,比如分两次输入。 然后,计算两数之和。这部分比较简单,将转换后的数字相加即可。但需要确保转换正确,处理可能的异常,比如用户输入非数字的情况。不过用户的问题可能暂时不需要异常处理,所以可能先忽略,或者提到可能存在错误的情况,但代码中不做处理。 最后,输出结果。使用print()函数输出,可能需要格式化输出,比如“两数之和为:”加上结果。这样用户可以看到明确的提示信息。 现在需要组织代码结构,确保每一步都清晰。例如: 1. 获取输入,两次input()调用。 2. 转换为float或int。 3. 相加。 4. 输出结果。 同时,可能需要考虑用户是否需要整数或浮点数处理。例如,如果用户输入的是整数,用int转换,否则用float。但有时候统一用float会更灵活,或者让用户自己决定。或者根据输入是否有小数点来判断?但这样可能复杂,所以代码中使用float来统一处理。 另外,用户可能希望代码尽可能简洁,或者带有注释说明每一步的作用。例如: num1 = float(input("请输入第一个数字:")) num2 = float(input("请输入第二个数字:")) sum = num1 + num2 print("两数之和为:", sum) 或者更简洁的写法: print(float(input()) + float(input())) 但后者没有提示信息,可能不够友好。 还需要考虑不同的Python版本兼容性,但input()在Python3中是标准用法,用户可能使用的是Python3,所以没问题。 可能用户后续的问题是处理异常输入,比如输入的不是数字,这时候需要try-except块。但当前问题可能不需要,但可以提到如果需要处理错误,可以如何扩展代码。 总结,用户需要的是一个简单直接的代码示例,分步骤解释,可能包含输入提示,类型转换,计算和输出。同时提醒可能的错误情况,但不需要深入处理。确保代码清晰易懂,适合新手学习。</think>以下是使用 Python 实现输入两个数字并计算两数之和的代码及详细说明: --- ### 基础版本代码 ```python # 获取用户输入的两个数字(自动处理整数或小数) num1 = float(input("请输入第一个数字: ")) num2 = float(input("请输入第二个数字: ")) # 计算两数之和 sum_result = num1 + num2 # 输出结果(保留两位小数) print(f"两数之和为: {sum_result:.2f}") ``` --- ### 代码说明 1. **输入处理** - 使用 `input()` 获取用户输入,并通过 `float()` 将输入字符串转换为浮点数(兼容整数和小数输入)。 2. **计算逻辑** - 直接使用加法运算符 `+` 对两个数值进行求和。 3. **输出优化** - 使用 **f-string 格式化输出**,`:.2f` 表示结果保留两位小数(可根据需求调整)。 --- ### 增强版本(包含异常处理) ```python try: num1 = float(input("请输入第一个数字: ")) num2 = float(input("请输入第二个数字: ")) print(f"两数之和为: {num1 + num2}") except ValueError: print("错误:请输入有效的数字!") ``` --- ### 其他变体 #### 1. 单行输入(空格分隔) ```python nums = input("请输入两个数字(空格分隔): ").split() print(float(nums[0]) + float(nums[1])) ``` #### 2. 纯整数计算 ```python num1 = int(input("请输入第一个整数: ")) num2 = int(input("请输入第二个整数: ")) print(f"整数和为: {num1 + num2}") ``` --- ### 关键知识点 - **类型转换**:`input()` 返回字符串,需用 `float()` 或 `int()` 转为数值。 - **异常处理**:用 `try-except` 捕获非数字输入错误。 - **格式化输出**:推荐使用 `f-string` 提升代码可读性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值