我正在试图找到一个BST的正确的侧面视图。我能够得到一个有效的解决方案,但我注意到使用
在Q中表示I:在范围内用于I(len(Q))
详细说明下面的代码工作
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 rightSideView(self, root: Optional[TreeNode]) -> List[int]:
if root == None:
return []
result = []
q = []
q.append(root)
while len(q):
for _ in range(len(q)):
node = q.pop(0)
if node.left != None:
q.append(node.left)
if node.right != None:
q.append(node.right)
result.append(node.val)
return result但是当我改变了下面的
在范围内(len(Q)):
至
(q):
如下所示
if root == None:
return []
result = []
q = []
q.append(root)
while len(q):
for _ in (q):
node = q.pop(0)
if node.left != None:
q.append(node.left)
if node.right != None:
q.append(node.right)
result.append(node.val)
return result我知道更长的时间能看到正确的侧面。任何人都不知道为什么会这样。
例如,使用输入
输入: root = 1,2,3,null,5,null,4
我使用范围(len(Q))代码输出获得输出: 1,3,4
但是,当我尝试使用范围(Q)代码时,我得到了输出输出: 2,5,4
发布于 2022-07-09 05:47:19
问题是,您是在修改q,同时通过弹出第一个元素来迭代它。迭代器从列表中的下一个位置获取元素,但所有元素都左移了1个位置。
在第一个例子中,使用range(len(q)),结果会产生结果,因为迭代器是根据循环开始时的q长度定义的,所以如果q有4个元素,那么它总是对4个迭代进行循环。_ in (0, 1, 2, 3)
在第二个示例中,每次调用q.pop(0)时,它都会移动列表中由一个位置留下的元素,从而跳过所有其他元素。
示例:
a = [ x for x in range(10)]
for val in a:
print(val, a.pop(0))
# OUTPUT
0 0
2 1
4 2
6 3
8 4注意val是如何只得到偶数值的,因为for循环创建的迭代器得到列表中的下一个位置(0、1、2、3、4等),而列表本身在每次迭代中都被左移。这也意味着在进入结束循环的StopIteration异常之前,它只获取5个值,而不是10个。
https://stackoverflow.com/questions/72918442
复制相似问题