在Python3中运行BST
有谁能解释一下计算机是如何进入walkTree(tree['right'])?我相信函数会一直调用自己直到在Python3中运行BST,python,recursion,binary-tree,binary-search-tree,tree-traversal,Python,Recursion,Binary Tree,Binary Search Tree,Tree Traversal,有谁能解释一下计算机是如何进入walkTree(tree['right'])?我相信函数会一直调用自己直到None,然后递归地弹出所有“左”堆栈并打印它们,但是当函数调用walkTree(tree['right'])时,当计算机再次经过walkTree(tree['left'])时,它在做什么 def walkTree(tree): if tree == None: return None walkTree(tree['left'] print(tree[
None
,然后递归地弹出所有“左”堆栈并打印它们,但是当函数调用walkTree(tree['right'])
时,当计算机再次经过walkTree(tree['left'])
时,它在做什么
def walkTree(tree):
if tree == None:
return None
walkTree(tree['left']
print(tree['data'])
walkTree(tree['right'])
BST是一种递归数据结构。 当您使用“left”值调用函数时,它将进入BST的左半部分。然后,这将递归并继续,直到它到达树中最左边的节点。 然后,它开始向上移动,并转到其父节点(最左侧节点的父节点)的直接右子树。然后,同样的过程继续进行,它首先访问左子树并以这种方式进行。 当它最终到达整个树的根时,当它返回时(在访问了左半部分中的所有节点之后),是时候访问右子树了。然后,如果存在任何根,它将再次转到该根的左边子树(绝对根的右边)。此左子树不是主树的左子树,而是主根的右节点的左子树 您的代码基本上会以升序打印整个BST中的值。 而且,我认为应该是这样
if tree == None:
return
BST是一种递归数据结构。 当您使用“left”值调用函数时,它将进入BST的左半部分。然后,这将递归并继续,直到它到达树中最左边的节点。 然后,它开始向上移动,并转到其父节点(最左侧节点的父节点)的直接右子树。然后,同样的过程继续进行,它首先访问左子树并以这种方式进行。 当它最终到达整个树的根时,当它返回时(在访问了左半部分中的所有节点之后),是时候访问右子树了。然后,如果存在任何根,它将再次转到该根的左边子树(绝对根的右边)。此左子树不是主树的左子树,而是主根的右节点的左子树 您的代码基本上会以升序打印整个BST中的值。 而且,我认为应该是这样
if tree == None:
return
听起来您不明白调用堆栈是如何工作的。 以一棵简单的树为例:
2
/ \
1 3
调用堆栈如下所示(使用缩进指示调用堆栈中的级别):
调用堆栈底部的
return
只返回到调用堆栈的上一层,而不是返回到调用堆栈的上一层。听起来您不理解调用堆栈是如何工作的。
以一棵简单的树为例:
2
/ \
1 3
调用堆栈如下所示(使用缩进指示调用堆栈中的级别):
位于调用堆栈底部的
return
只返回到调用堆栈的上一级,而不是返回到调用堆栈的上一级。一旦返回到左侧的底部,它将返回调用堆栈,打印当前节点中的数据,然后返回到右侧的。假设您正确终止递归,一个简单的23
树将打印2,1,3
。如果Tree==None,您不应该从函数返回吗@OluwafemiSule@AChampion我知道这个节目是做什么的,我仍然不清楚它是如何做到的,一旦它到达左侧的底部
,它将返回调用堆栈,打印当前节点中的数据,然后返回右侧
。假设您正确终止递归,一个简单的23
树将打印2,1,3
。如果Tree==None,您不应该从函数返回吗@OluwafemiSule@AChampion我知道这个节目是做什么的,我仍然对它是怎么回事感到困惑。我相信return和return None的行为是相同的,但是谢谢你这么好的解释。是的,直到我发布了我的答案,我才看到你的编辑。是的,是一样的。而且,如果您想知道递归是如何工作的,简而言之,堆栈帧是在内存中创建的。每次递归控制再深入一层时,调用函数的地址就会被推入堆栈中。这是为了知道返回时返回的位置。每个地址都以后进先出的方式从堆栈中弹出。主根的控件向左移动,依此类推。最后,当它再次返回到主根时,它现在可以转到正确的子树,依此类推…@DrJessop你是正确的,一个裸返回使用一个隐式无
,但是如果无
没有意义,惯例会说使用裸返回,在本例中,情况并非如此:我相信return和return None的行为是相同的,但感谢您这么好的解释。是的,直到我发布了我的答案,我才看到您的编辑。是的,是一样的。而且,如果您想知道递归是如何工作的,简而言之,堆栈帧是在内存中创建的。每次递归控制再深入一层时,调用函数的地址就会被推入堆栈中。这是为了知道返回时返回的位置。每个地址都以后进先出的方式从堆栈中弹出。主根的控件向左移动,依此类推。最后,当它再次返回到主根时,它现在可以转到正确的子树,依此类推…@DrJessop你是对的,一个裸返回
使用一个隐式无
,但是如果无
没有意义,惯例会说使用裸返回
,在这种情况下它没有意义: