我有一个执行二叉树遍历的函数,并且有一个全局列表“堆栈”来存储临时值。
stack = []
def search(root, v):
global stack
stack.append(root.info)
if root.info == v:
print(stack) #<------- THE FIRST PRINT IS HERE
return
if root.left is not None:
search(root.left, v)
if root.right is not None:
search(root.right, v)
stack.pop()
pass
def lca(root, v1, v2):
search(root,v1)
print(stack) #<------- THE SECOND PRINT IS HERE
您的输出(标准输出)
[4, 2, 1]
[4]
输入:v1 = 1,v2 = 7
当我从函数的内部和外部打印列表的值时,我发现结果是不同的-在内部打印时,结果为[4,2,1],外部为[4]。我尝试了不同的方法,例如在函数外部创建列表,然后将其传递给函数,结果始终是相同的。谁能知道为什么会这样吗?
答案 0 :(得分:2)
您似乎相信,在您的return
函数中按下显式search
之后,您的递归搜索就会停止。但事实并非如此。 search
调用在更高的调用堆栈中仍会继续触发更多搜索,将内容从stack
弹出,更改其内容。
也许您想要这样的事情:使用search
的返回值在成功找到其要查找的内容时发出信号,并且在此之后不再搜索。
def search(root, v):
global stack
stack.append(root.info)
if root.info == v:
print(stack)
return True
if root.left is not None and search(root.left, v):
return True
if root.right is not None and search(root.right, v):
return True
stack.pop()
return False
这将防止在找到该值之后更改堆栈。