我在理解预订,顺序和后序树遍历中涉及的递归函数时遇到了一些麻烦 . 我有一些递归的知识(但不可否认它不是我的强项) . 所有这些人似乎都称自己两次先与根的左子女打电话,然后与正确的孩子打电话 . 但这究竟是怎么可能的呢?对左子项的preOrder函数的调用不会将控制流返回到顶部,并且下一次调用永远不会执行吗?
void preOrder (Node* root)
{
if (root == NULL) return;
cout<<root->val<<", ";
preOrder(root->left);
preOrder(root->right);
}
3 回答
对左子项的preOrder函数的调用不会将控制流返回到顶部,并且下一次调用永远不会执行吗?
当然不是 . 递归调用就像任何其他函数调用一样:在函数完成后,控件返回到调用位置 . 'place'不仅意味着代码中的点,还意味着调用堆栈上的点,这意味着同一组变量可以再次使用 . 就像从任何其他功能返回后一样 .
例如,如果你有一棵树
并且在
A
节点上调用preorder
,然后它首先打印A
内容,然后在X
上调用preorder
,并在返回时返回到preorder(A)
,因此它继续在Y
上调用preorder
.Preorder :处理节点,移动到左侧子节点,移动到右侧子节点
Inorder :向左移动,处理节点,向右移动
Postorder :移动到左侧节点,移动到右侧节点,处理节点