使用二叉树中的递归计数让我很困惑

时间:2016-12-09 00:24:17

标签: algorithm recursion tree counting

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

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

提前感谢您的回复

2 个答案:

答案 0 :(得分:0)

为了计算二叉树中的某些东西,它的递归定义非常方便:

  

树由三个元素组成:作为根的节点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)

答案 1 :(得分:0)

许多人在使用递归(或通常使用递归解决方案)计算树时遇到困难。所以我会提出建议而不采取任何具体的例子。

树和递归的问题是 - 控制流程不是直接的,就像迭代解决方案一样。在树中,您必须访问所有分支,特别是所有节点,并根据问题的需求计算一些东西。无论你使用什么遍历,你需要首先弄清楚任何节点的计算条件是什么,比如你在寻找叶子然后什么条件定义任何节点 - 叶子。一旦弄明白,就可以在递归中得到基本条件的确认,然后你可以继续访问每个节点,在满足特定条件时增加计数器,并在满足返回/终止条件时终止或从递归调用返回。

你需要训练一下你的想法,以便可视化递归结构,为此你只需手动运行递归函数来解决你读或记忆的问题。使用您创建的示例可以解决几个问题。 希望它有所帮助!