我在树遍历中理解递归执行时遇到问题。
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)?
答案 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右子级并且一如既往地继续。
你必须想象递归的级别,当你完成一个返回到前一个,并继续正常执行,直到没有更多的递归。
如果你什么都不懂,我希望它可以帮助你,对不起我的英语。