繁体   English   中英

用二进制树中的递归计数让我感到困惑

[英]Counting with recursion in binary trees confuse me

我正在尝试尽可能多地学习关于树及其算法的知识。 当我想对二叉树中的内容进行计数时,似乎无法真正了解递归的工作原理。 例如,如果我想计算节点或叶子或其他东西。 当我查看解决方案时,我不知道计数器如何增加等等。我可以记住该特定问题的解决方案,但是当我遇到另一个包括计数在内的问题时,我不知道如何启动我的功能。

您对我的问题有什么建议吗? 您如何通过递归学习不同的计数算法。 我完全理解每种迭代解决方案,并且知道如何使用。

预先感谢您的回复

为了对二叉树中的事物进行计数,其递归定义非常方便:

一棵树由三个元素组成:节点N是树的根,子树L是树本身,子树R也是树。

使用此定义,例如,我们可以按以下方式计算树的叶子:
一棵树的叶子数是

  • 如果树为空( Nnull ),则为0
  • 如果LR都为空,则为1
  • 否则LR的叶子数

基本思想是,我们可以使用休假没有子代( LR都是空的)和空树没有叶子的事实作为基本情况。 从这一点出发,我们可以简单地说一棵树具有上述属性之一,因此根本身就是叶子,或者树中没有节点,或者叶子分布在LR ,我们只需要计算和总结两个子树中的叶子数。

或作为伪代码:

countLeaves(node N):
    //the tree is empty
    if N == null:
        return 0

    //N is a leave
    if L == null && R == null:
        return 1

    //count leaves in both subtrees
    return countLeaves(L) + countLeaves(R)

许多人在使用递归(或通常使用递归解决方案)计算树木时面临困难。 因此,我将在不举任何具体例子的情况下给出建议。

树和递归的问题是-控制流不是像迭代解决方案那样简单。 在树中,您必须访问所有分支,尤其是所有节点,并根据问题的需求进行计数。 无论使用哪种遍历,都需要首先弄清楚要计数的任何节点的条件是什么,例如,如果您正在寻找叶子,那么什么条件定义了任何节点-叶子。 一旦弄清楚了,您就会在递归中获得基本条件的确认,然后您就可以继续访问每个节点,在满足特定条件时增加计数器,并在满足返回/终止条件时终止或从递归调用中返回。

您需要稍微训练一下才能可视化递归结构,为此,只需手动运行递归函数即可解决您所阅读或记住的问题。 使用您创建的示例可以解决一些问题。 希望能帮助到你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM