Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python3中运行BST_Python_Recursion_Binary Tree_Binary Search Tree_Tree Traversal - Fatal编程技术网

在Python3中运行BST

在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[

有谁能解释一下计算机是如何进入walkTree(tree['right'])?我相信函数会一直调用自己直到
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你是对的,一个裸
返回
使用一个隐式
,但是如果
没有意义,惯例会说使用裸
返回
,在这种情况下它没有意义: