递归调用后返回

2024-05-23 20:03:10 发布

您现在位置:Python中文网/ 问答频道 /正文

在递归调用之前返回和在递归调用之后返回有什么区别

例如,如果我有如下代码

class TreeNode:
  def __init__(self, val, left=None, right=None):
    self.val = val
    self.left = left
    self.right = right


class TreeDiameter:

  def __init__(self):
    self.treeDiameter = 0

  def find_diameter(self, root):
    self.calculate_height(root)
    return self.treeDiameter

  def calculate_height(self, currentNode):
    if currentNode is None:
      return 0

    leftTreeHeight = self.calculate_height(currentNode.left)
    rightTreeHeight = self.calculate_height(currentNode.right)

    if leftTreeHeight is not None and rightTreeHeight is not None:
      diameter = leftTreeHeight + rightTreeHeight + 1
      self.treeDiameter = max(self.treeDiameter, diameter)

    return max(leftTreeHeight, rightTreeHeight) + 1

有一种基本情况,如果currentNode is None,则返回0。但是leftTreeHeightrightTreeHeight被分配递归调用

赋值之后,代码最终返回max(leftTreeHeigth, rightTreeHeight) + 1

这个返回是在递归调用之后完成的,我认为在这一点上程序将结束,但在通过调试器之后,我注意到程序继续并跳过递归函数

我不知道如何描述它,但我的想法是在递归函数中,我会沿着左子树和右子树,每次如果找到一个节点,就加1。获取其根节点左侧的最大高度和右侧的最大高度加1,并在最后返回根的最大左侧树高度和最大右侧树高度加1

我认为所有这些都将在递归调用之前完成。我认为递归调用之后的任何事情都只会发生一次。我知道这不是它的工作原理,但如果我能解释我不确定这个程序是如何工作的,我可以写出步骤

一旦我们在递归函数中calculate_height

  1. 如果当前节点为空,则返回0
  2. 将递归函数赋值给leftTreeHeight
  3. 当我们有一个节点时,我们继续步骤2
  4. 当我们经过叶节点时,最后返回0
  5. 将递归函数赋值给rightTreeHeight
  6. 当我们有一个节点时,我们继续步骤5
  7. 当我们经过叶节点时,最后返回0
  8. 经过递归调用,转到if语句,据我所知leftTreeHeightrightTreeHeight都应该是0
  9. 将左高+右高和+1指定给直径,使根节点的直径为1
  10. 更新我们的最大树直径在这种情况下,它将是1
  11. 然后返回左树和右树高度的最大值,并将该最大值加1。因为leftTreeHeightrightTreeHeight都是0,所以应该返回1

在最后一步之后,我认为函数将结束,我不理解代码如何在递归函数中继续跳转。另外,我知道如果它像我提到的那样返回1,那么它将始终是1,结果将是错误的。我不是问我是否正确,因为我知道我错了,我只是想澄清一下。我很难想象


Tags: 代码selfrightnone高度节点isdef