递归函数如何在二叉树上执行操作?

时间:2014-03-24 03:14:35

标签: c++ recursion data-structures tree binary-tree

我无法理解这个概念。

 void preorderPrint( TreeNode *root ) {

    if ( root != NULL ) {  // (Otherwise, there's nothing to print.)
       cout << root->item << " ";      // Print the root item.
       preorderPrint( root->left );    // Print items in left subtree.
       preorderPrint( root->right );   // Print items in right subtree.
    }
 } 

这如何打印出二叉树中的节点?它似乎只是遍历树,并且不会打印除根项目之外的任何内容。

此外,在我看来,使用二叉树的递归函数只是以直线遍历树。即root-&gt; left只跟踪到最左边节点的路径并忽略左子树中的右边节点。这是如何一步一步的?

1 个答案:

答案 0 :(得分:2)

你错过了这样一个事实:当一个函数调用另一个函数并且内部函数返回时,另一个函数从它停止的地方恢复。

考虑具有根节点和左节点的树。发生以下情况:

  1. 我们在根节点上调用preorderPrint。

  2. 输出根节点的内容。

  3. 它在左侧节点上调用preorderPrint。

  4. 这将输出左节点的内容。它在NULL上调用preorderPrint两次,它什么都不做,然后返回。

  5. 对preorderPrint的原始调用将恢复,在根节点的右指针上调用preorderPrint,该节点为NULL,并且不执行任何操作。