我正在尽可能多地学习树和他们的算法。当我想在二叉树中计算某些东西时,似乎我无法真正了解递归是如何工作的。例如,如果我想计算节点或叶子或其他东西。当我查看解决方案时,我不知道计数器如何增加等等。我可以记住该特定问题的解决方案但是,当我得到另一个包括计数的问题时我不知道如何启动我的功能。
您对我的问题有任何建议吗?你是如何通过递归学习不同的计数算法的?我完全理解每个迭代解决方案,我知道如何使用它。
提前感谢您的回复
答案 0 :(得分:0)
为了计算二叉树中的某些东西,它的递归定义非常方便:
树由三个元素组成:作为根的节点
N
,作为树本身的子树L
和作为树的子树R
。
使用这个定义,我们可以用以下方式计算树的叶子:
树的叶子数是
N
为null
),则为L
和R
都为空,则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)
答案 1 :(得分:0)
许多人在使用递归(或通常使用递归解决方案)计算树时遇到困难。所以我会提出建议而不采取任何具体的例子。
树和递归的问题是 - 控制流程不是直接的,就像迭代解决方案一样。在树中,您必须访问所有分支,特别是所有节点,并根据问题的需求计算一些东西。无论你使用什么遍历,你需要首先弄清楚任何节点的计算条件是什么,比如你在寻找叶子然后什么条件定义任何节点 - 叶子。一旦弄明白,就可以在递归中得到基本条件的确认,然后你可以继续访问每个节点,在满足特定条件时增加计数器,并在满足返回/终止条件时终止或从递归调用返回。
你需要训练一下你的想法,以便可视化递归结构,为此你只需手动运行递归函数来解决你读或记忆的问题。使用您创建的示例可以解决几个问题。 希望它有所帮助!