理解树遍历中递归的执行

时间:2016-04-29 08:25:14

标签: recursion tree tree-traversal

我在树遍历中理解递归执行时遇到问题。

 void travel (Node *tree)
 { 
     if(tree!=NULL)
     {
         printf("%d ",tree->info); 
         travel(tree->left);
         travel(tree->right);
      }
 }

您可以在这里解释

      1
   2     3
 4     5   6

输出:1 2 4 3 5 6

达到4后会发生什么。编译器如何忽略行程(树 - >左)以及它如何回溯到1并达到3.

我的确切问题是如何忽略函数调用travel(tree-> left)?

2 个答案:

答案 0 :(得分:0)

一切都是关于从函数返回。

     void travel (Node *tree)
 { 
     if(tree!=NULL)
     {
         printf("%d ",tree->info); 
         travel(tree->left);
         travel(tree->right);
      }
 }


      1
   2     3
 4     5   6

在上面的函数中,它会沿着一条小路走,就像有一个孩子一样。如果它没有找到左孩子,那么尝试正确的孩子。如果找不到合适的孩子,则返回该功能。直到我们到达节点“4”,我们还没有处理来自该函数的单个返回。一旦我们在4,我们看到没有剩下的孩子离开,所以我们尝试正确的孩子,但也没有正确的孩子。所以我们将函数从我们调用的地方返回。那恰好是2.所以我们将继续从我们离开的地方2.在2我们通过调用travel(tree->left);指令走左路径,现在我们从这条指令返回,现在我们将继续下一步指令是travel(tree->right);唉没有合适的孩子所以我们从我们开始的地方返回函数..恰好是第travel(tree->right);行的节点1现在转向下一行{{1}因此我们到达3。

我希望你能效仿。

答案 1 :(得分:0)

首先,我想你知道程序什么时候输入一个函数,它不会退出它直到它结束。之后,我们来分析代码及其执行情况。

我假设您在if语句中由于NULL条件而使用指针,并且每个元素都有两个指向左右子节点的指针,也可以为null。

首先,你的函数分析第一个元素(Number 1)并检查是否为null,因为它不是,输入if语句,打印它的值并转到它的左子节点,重复该过程,检查是否4是null,因为它不是,输入if语句打印它的值并转到它的左子,这是递归魔术发生,当元素4的子元素为null时,函数返回并不继续递归。之后,它返回到数字4元素的级别,并检查右子级,因为它为null返回到数字1级别,并且知道检查号码1右子级并且一如既往地继续。

你必须想象递归的级别,当你完成一个返回到前一个,并继续正常执行,直到没有更多的递归。

如果你什么都不懂,我希望它可以帮助你,对不起我的英语。