在while循环的最后一行和while循环的第一行重新输入之间,变量似乎已更改/消失

时间:2018-08-22 00:15:34

标签: python

坚持LeetCode问题94。二叉树有序遍历(Python)。

这是问题

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

我的问题是,在while循环的最后一行,显然有一个节点分配给了变量“ node”。但是在第一行,它说什么都没有分配给变量“节点”。同样,这似乎仅在while循环中经过几个循环之后才发生。第一行和最后一行之间会发生什么?对于前几个循环,while循环的第一行和最后一行之间的“ node”值完全相同。第三次,发生更改。

这是我到目前为止可以解决的办法

# 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

这是它给我的错误消息

  

第23行:AttributeError:“ NoneType”对象没有属性“ 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语句中,您可以知道在node循环的最后一行,有一个节点分配给变量while,但是在第一行,这就是我得到的错误,表明没有为变量node分配任何内容。

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

1 个答案:

答案 0 :(得分:0)

由于@zvone建议在while循环之前放置一个print语句,所以我能够弄清楚它继续在leetcode上打印所有测试用例。其中一种情况是未输入新节点。除非您建议在while循环之前放置一个打印语句,否则我不会发现这一点。