【问题标题】:Recursion counting leaves in binary trees递归计算二叉树中的叶子
【发布时间】:2016-01-17 08:13:24
【问题描述】:

我不明白,为什么我无法想出一个简单的递归函数来计算二叉树上的叶子数。我很惭愧地说,我只是一脸茫然,盯着显示器试图弄清楚为什么一切都不起作用。 为什么很难实现,什么有效,什么无效?这应该是直观的还是不直观的?

def num_leaves(tree):
    if (tree.get_left() is None) and (tree.get_right is None()):
         return 1

    #something goes here..


    return #something here..

有人可以提供一些建议,为什么我可能没有发现它想象的那么简单

谢谢

【问题讨论】:

  • 你试过递归吗?它使问题变得更容易。
  • 这就是我想要做的,我只确定了基本情况,但我不确定现在该做什么
  • 好的,这个想法是,如果你在一个节点中,你必须计算那个节点,所以创建一个变量并立即分配 1 给它,接下来你必须向它添加子节点的数量左边,然后是右边的孩子的数量。最后归还这笔款项。如果没有孩子它应该返回1,单独的节点,如果有左孩子,那么它应该是1+孩子(左),如果有孩子左右,那么它应该是1+孩子(左)+孩子(对)
  • 这是要数叶子的数量? (所有节点正好有 0 个子节点)
  • 哦,对不起,我不知道你叫什么叶子,无论如何这个想法很容易从那个案例中改编,它实际上是相同的过程,而不是仅仅添加 1+childs 你只添加 1 if没有孩子,否则如果只剩下孩子,则返回左孩子的函数,如果两者都有,则返回左孩子的函数结果+右孩子的函数结果。跨度>

标签: python-3.x recursion binary-tree


【解决方案1】:

我怀疑这是您处理递归的最初几次之一。我这么说是因为我前几次也有同样的感觉。

您的想法是正确的:您已经确定并(正确)实施了您的基本案例。所以,在我们实际编写代码之前,让我们先写下关于解决方案的一些想法:

基本理念

  • 识别 BTree 的所有叶子
  • 如果一个节点没有子节点,它就是一个叶子
  • 如果节点确实有子节点,则它不是叶子节点。统计左边BTree的叶子数和右边BTree的节点数,相加

好的,现在我们有了基本的想法,让我们尝试一些伪代码

function countLeaves(rootNode):
    if nootNode has no children:  # this is a leaf
        return 1
    if rootNode has a left child:  # non-leaf nodes may be missing a left or right child
        leftLeaves = countLeaves(left child of rootNode)
    else:
        leftLeaves = 0

    if rootNode has a right child:
        rightLeaves = countLeaves(right child of rootNode)
    else:
        rightLeaves = 0

    return leftLeaves + rightLeaves

有意义吗?好的,让我们写一些python代码:

def countLeaves(root):
    if (root.get_left() is None) and (root.get_right() is None):  # we are a leaf
        return 1

    leftChild = root.get_left()
    if leftChild is not None:
        leftChildren = countLeaves(leftChild)
    else:
        leftChildren = 0

    rightChild = root.get_right()
    if rightChild is not None:
        rightChildren = countLeaves(rightChild)
    else:
        rightChildren = 0

    return leftChildren + rightChildren

既然我们已经编写了这个想法,让我们稍微清理一下:

def countLeaves(root):
    if root.get_left() is None and root.get_right() is None: return 1
    return (0 if root.get_left() is None else countLeaves(root.get_left())) + (0 if root.get_right() is None else countLeaves(root.get_right()))

【讨论】:

  • 非常感谢,我会一直处理到完全理解为止
猜你喜欢
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 2017-04-28
  • 2011-02-15
相关资源
最近更新 更多