[英]Counting with recursion in binary trees confuse me
我正在尝试尽可能多地学习关于树及其算法的知识。 当我想对二叉树中的内容进行计数时,似乎无法真正了解递归的工作原理。 例如,如果我想计算节点或叶子或其他东西。 当我查看解决方案时,我不知道计数器如何增加等等。我可以记住该特定问题的解决方案,但是当我遇到另一个包括计数在内的问题时,我不知道如何启动我的功能。
您对我的问题有什么建议吗? 您如何通过递归学习不同的计数算法。 我完全理解每种迭代解决方案,并且知道如何使用。
预先感谢您的回复
为了对二叉树中的事物进行计数,其递归定义非常方便:
一棵树由三个元素组成:节点
N
是树的根,子树L
是树本身,子树R
也是树。
使用此定义,例如,我们可以按以下方式计算树的叶子:
一棵树的叶子数是
N
为null
),则为0 L
和R
都为空,则为1 L
和R
的叶子数 基本思想是,我们可以使用休假没有子代( L
和R
都是空的)和空树没有叶子的事实作为基本情况。 从这一点出发,我们可以简单地说一棵树具有上述属性之一,因此根本身就是叶子,或者树中没有节点,或者叶子分布在L
和R
,我们只需要计算和总结两个子树中的叶子数。
或作为伪代码:
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.