提出树遍历的递归算法的分步方法?

时间:2014-12-10 17:12:14

标签: algorithm recursion tree pseudocode tree-traversal

我试图直观地理解如何创建递归函数(对于任何事情),但主要是为了遍历树以检查该树是否符合某些标准。

对于一个随机的例子,计算二进制树中不是根或叶子的节点数? 我如何递归地思考这个问题并最终想出一个伪代码解决方案? 以前,我会通过绘制不同的场景并创建伪代码来解决我提出的案例,从而开始这样的问题,但我觉得(并且确实)在这里和那里都错过了一些逻辑。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

通常,递归是关于找到重复模式并将其外推到更通用的解决方案。根据维基百科:

  

"递归是以自相似的方式重复项目的过程。“

但这是一个非常含糊不清的定义。让我们来看看这些例子。


二叉树是一种高度重复的结构。考虑这个(几乎)最小的例子:

enter image description here

现在,假设您要访问该树中的每个节点,假设您是从根目录开始的。看起来非常简单:

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. 

看一下二叉树的另一个例子:

enter image description here

正如您所看到的那样,与之前的结构有很大的相似之处。现在,让我们访问每个彩色节点:

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