该递归函数如何工作,与计算结构有关吗?

时间:2019-10-20 14:10:23

标签: python-3.x recursion tree

我正在使用树遍历代码,已经获得了伪代码,并在python中实现了它,但是我仍然不知道它是如何工作的

InOrderTraversal(tree):
  if tree = nil:
     return
  InOrderTraversal(tree.left)
  Print(tree.key)
  InOrderTraversal(tree.right)

伪代码如上所示: InOrderTraversal(tree.left):此代码找到树的最左侧节点,我以为然后停在那里。但是,如何才能回到父母的身边呢?并遍历树的所有节点。它可以返回节点,这让我感到困惑,是关于计算机的某些内部结构

2 个答案:

答案 0 :(得分:0)

上面的伪代码在Tree(数据结构)上进行迭代。

递归函数是可以自行调用直到满足终止条件的函数。

在一棵树中,有一个根节点,它将有一个左子节点和一个右子节点,每个子节点可能具有相似的右子节点和左子节点(或者可能没有子节点,也可能没有左子节点或右子节点)。 / p>

如果说任何一个孩子(或根孩子)没有合适的孩子,那么右边的孩子将为null,同样,左边的孩子也是如此。

因此,上面的代码调用了两次,一次遍历左分支,第二遍遍右分支。

我将尝试以简单的语言进行解释,而不是使用大量的技术术语和令人困惑的概念(保持简单):

让我们谈谈左分支(例如),

假设它就像A-B-C-D-E

现在,A is root,第一个函数调用将使用A as ref进行调用,因为它的左子级不等于null(即有子级),因此现在将调用InOrderTraversal并使用A的孩子,即B as ref,与此同时,带有A的ref的函数调用存储在call-stack中,

再一次,B的孩子是C,也不是null,因此用InOrderTraversal再次调用函数C's ref,并且call-stack将引用存储到B的ref ,

此时,调用堆栈看起来像这样

 InOrderTraversal(C)
 InOrderTraversal(B)
 InOrderTraversal(A)

这样一直进行到E,现在E没有孩子了,所以它将返回到调用他的函数,即使用D的ref进行函数调用,然后再次返回,最后,我们进入main函数调用,它会生成所有这些函数调用。

右分支也是如此。

因此,可以通过 call-stack 来实现。

我试图解释让您感到困惑的部分。

我希望这可以帮助您理解它。

答案 1 :(得分:0)

如果调用一个函数,它会记住从哪里调用该函数,然后在完成时返回,因此它返回到其父级,因为在那儿调用了它,并在完成时返回了它。只需拿一棵简单的树,然后逐步考虑会发生什么。

从代码中我认为这是针对二叉树的(每个节点只能有两个孩子)?拿一棵像https://commons.wikimedia.org/wiki/File:Sorted_binary_tree_preorder.svg#/media/File:Sorted_binary_tree_preorder.svg这样的树,它恰好显示了算法沿其周围的线的顺序。 它以F作为树的值从顶部开始, 用B再次调用相同的函数 与A调用相同的函数 A没有子节点,因此如果tree = nil会触发其两个InOrderTraversal调用并立即返回 这样,以A作为树调用的函数也到达其功能块的末尾,并返回到调用它的函数。现在我们回到节点B。由于第二个InOrderTraversal用于正确的节点,所以代码继续到节点D。

以此类推,只需一步一步地进行操作,它就会变得清晰起来。 (或在必要时使用调试器。)

  

InOrderTraversal(tree.left):此代码查找树的最左侧节点,

Tree.left只是当前节点的左子节点,该函数调用将遍历该左子节点及其所有子节点。

相关问题