钻牛角尖多数情况下就是浪费时间(力扣112 路径总和)

发布时间:2024年01月17日
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
        self.traversal(root, targetSum)
        return self.symbol
    def __init__(self):
        self.symbol = False
    def traversal(self, node, count):
        if self.symbol == True:
            return
        if not node:
            return
        count -= node.val
        if not node.left and not node.right and count == 0:
            self.symbol = True
        self.traversal(node.left, count)
        self.traversal(node.right, count)
    # 以上是正确且简洁的版本
   

? ? ?
? ? ? ??
? ? #以下是错的。错因在于,由于没有返回值,所以值只能从上往下传递无法从下往上传递
? ? #当symbol为True时,因为处于最下层,因此无法向上传递。
? ? #比如在第三层i=3,然后处理左右子树,进入下一层递归,然后在下一层递归i会变成4,
? ? #但是i=4的这层递归结束之后,回到第三层时,i还是3。

? ? #但是在其他题里看到列表形式的变量是可以进行值传递的,当变量在下一层更新时,当前层也会同步进行更新。于是开始钻牛角尖:尝试将symbol改成列表类型,看看当symbol append(1)时,其他层是否会保留symbol的变更? ? ? ?
??
? ? ? ? symbol = [0]
? ? ? ? test = []
? ? ? ? self.traversal(root, targetSum, symbol, test)
? ? ? ? return test
? ? def traversal(self, node, count, symbol, test):
? ? ? ? if not node:
? ? ? ? ? ? return
? ? ? ? count -= node.val
? ? ? ? test.append(symbol)
? ? ? ? if not node.left and not node.right and count == 0:
? ? ? ? ? ? symbol.append(1)
? ? ? ? self.traversal(node.left, count, symbol, test)
? ? ? ? self.traversal(node.right, count, symbol, test)

但是结果非常抽象,运行后得到:

可见哪怕在第一层,就已经得到append的那个1了,明明此时根本还没运行到那一行

于是再测试,将 ? test.append(symbol) 改成 ? test.append(symbol[1])。如果真的如代码输出所示,symbol在第一层就已经是[0,1]了,那么把symbol的第二个元素提出来应该不会有问题,但是却报错:out of index

所以在第一层迭代的时候symbol不可能是[0,1]的值,不知为何能够直接输出[0,1],非常奇妙

所以何必钻牛角尖,有时候钻不明白的地方本不是自己的问题

文章来源:https://blog.csdn.net/weixin_42396719/article/details/135656312
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。