我试图直观地理解如何创建递归函数(对于任何事情),但主要是为了遍历树以检查该树是否符合某些标准。
对于一个随机的例子,计算二进制树中不是根或叶子的节点数? 我如何递归地思考这个问题并最终想出一个伪代码解决方案? 以前,我会通过绘制不同的场景并创建伪代码来解决我提出的案例,从而开始这样的问题,但我觉得(并且确实)在这里和那里都错过了一些逻辑。
有什么建议吗?
答案 0 :(得分:1)
通常,递归是关于找到重复模式并将其外推到更通用的解决方案。根据维基百科:
"递归是以自相似的方式重复项目的过程。“
但这是一个非常含糊不清的定义。让我们来看看这些例子。
二叉树是一种高度重复的结构。考虑这个(几乎)最小的例子:
现在,假设您要访问该树中的每个节点,假设您是从根目录开始的。看起来非常简单:
visit(l_child)
already in root
visit(r_child)
already in root
/ \
/ \
visit(l_child) visit(r_child)
所以基本上你是:
starting in the root →
visiting the left child →
getting back to the root →
visiting the right child →
getting back to the root.
看一下二叉树的另一个例子:
正如您所看到的那样,与之前的结构有很大的相似之处。现在,让我们访问每个彩色节点:
visit(l_subtree)
already in root
visit(r_subtree)
它的模式完全相同。由于我们知道如何遍历子树,因此我们可以考虑更通用的算法:
inorder(node):
if node == null: //we've reached the bottom of a binary tree
return 0
inorder(node.l_child)
do_something(node)
inorder(node.r_child)
这就是整个inorder遍历算法。我确定你可以自己弄清楚如何编写预订和后序的伪代码。
如果递归仍不直观,您可以查看fractals example。