在while循环的最后一行和while循环的第一行返回之间,变量似乎发生了变化/消失

2024-05-11 03:24:11 发布

您现在位置:Python中文网/ 问答频道 /正文

困在LeetCode问题上94.二叉树顺序遍历(Python)

问题就在这里

https://leetcode.com/problems/binary-tree-inorder-traversal/description/

我的问题是,在while循环的最后一行,显然有一个节点分配给变量node。但在第一行中,它表示没有为变量“node”赋值。而且,这似乎只发生在通过while循环的几个循环之后。第一行和最后一行之间会发生什么?对于前几个循环,“node”的值在while循环的第一行和最后一行之间完全相同。第三次,发生了变化

这是迄今为止我能找到的解决方案

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def inorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """

        res = []
        rootTrack = []
        rootCovered = []


        rootTrack.append(root)
        i=0
        while rootTrack:
            print('right after while loop re-enter', root.val)
            while root.left and root.left not in rootCovered:
                root = root.left
                print('left value ', root.val)
                rootTrack.append(root)
            if len(rootTrack) > 0:
                root = rootTrack.pop() 
                res.append(root.val)  
                rootCovered.append(root)
                print('pop value ', root.val)
            if root.right and root.right not in rootCovered:
                root = root.right
                print('right value ', root.val)
                rootTrack.append(root)
            print('final before while loop re-enter ', root.val)
        return res

这是它给我的错误信息

Line 23: AttributeError: 'NoneType' object has no attribute 'val'

指的是这行代码

print('right after while loop re-enter', root.val)

这是标准件

right after while loop re-enter 1
pop value  1
right value  2
final before while loop re-enter  2
right after while loop re-enter 2
left value  3
pop value  3
final before while loop re-enter  3
right after while loop re-enter 3
pop value  2
final before while loop re-enter  2

从print语句中可以看出,在while循环的最后一行,有一个节点被分配给变量node,但在第一行,我得到一个错误,表示变量node没有分配任何内容

在下一轮的第一行while循环的最后一行之前会发生什么


Tags: selfrightreloopnodevaluevalroot
1条回答
网友
1楼 · 发布于 2024-05-11 03:24:11

多亏@zvone的建议,在while循环之前放一个print语句,我才知道它一直在leetcode上打印所有的测试用例。其中一个案例没有输入新节点。除非你建议在while循环之前放一个print语句,否则我不会发现这一点

相关问题 更多 >