【问题标题】:Summing up node depths in a binary tree总结二叉树中的节点深度
【发布时间】:2020-10-24 10:46:22
【问题描述】:

为了总结任何给定二叉树中所有节点的深度,我编写了以下递归算法:

def nodeDepths(root):
    final=0
    helper(root,0,final)
    return final

def helper(node,d,final):
    if not node:
        return 
    final+=d
    helper(node.left,d+1,final)
    helper(node.right,d+1,final)

class BinaryTree:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

我的想法是:当我看到每个节点时,将该节点的深度添加到最终总和中,然后递归调用左右,以便它们可以做同样的事情。在递归调用堆栈结束时,最终总和应该具有正确的值。

实际结果:最终总和为0。

为什么这不起作用?

【问题讨论】:

  • 因为helper 方法没有返回任何实质性内容。你总是返回 0。
  • @pecey 这就是我打算对“final”进行修改的原因。我假设每次修改 nodeDepths() 中定义的“最终”时传递给帮助程序的“最终”变量。 helper 不会通过 ref 修改 var 'final' 吗?
  • 我认为this 会帮助您理解。但简而言之,当您将变量final 传递给helper 时,它不会修改nodeDepths 中声明的final。为此,您必须将 final 设为全局变量。

标签: python recursion binary-tree


【解决方案1】:

Python 传递它的参数by assignment。因此,如果将列表而不是变量传递给上述方法,它将像这里一样工作:

def nodeDepths(root):
    final=[0]
    helper(root,0,final)
    return final[0]

def helper(node,d,final):
    if not node:
        return 
    final[0]+=d
    helper(node.left,d+1,final)
    helper(node.right,d+1,final)

简单来说,

  • 如果传入可变对象,则可以对其进行更改,但如果将其分配给,则外部变量将不会反映更改。
  • 如果传入的是不可变对象,则无法更改,外部变量也不会反映更改。

【讨论】:

    猜你喜欢
    • 2020-07-19
    • 1970-01-01
    • 2011-06-20
    • 2021-01-02
    • 2012-10-10
    • 2021-02-19
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    相关资源
    最近更新 更多