刚接触算法时,遇到dfs中的return一直很疑惑,为什么每次return会回到上一层,并且继续向下执行呢?
以二叉树的前序遍历为例子,我们很容易写出这样的代码
void traversal(TreeNode* cur, vector<int>& vec) {
if (cur == NULL) return; // 递归终止条件
vec.push_back(cur->val); // 处理当前节点(根)
traversal(cur->left, vec); // 递归左子树
traversal(cur->right, vec); // 递归右子树
}
以下面这颗树为例子
一开始一直向左遍历,直到遇到节点4,这时调用4的左节点为空,return回到4,调用4的右节点,return回到4,这是节点4的函数执行完毕,回到2
为什么是这样子的呢?
由于本人不再学习c++,下面以java解释
在JVM中,每一个函数的调用都会有一个栈帧,每一个栈帧中会有一个自己的程序计数器,记录当前函数执行位置。
往左递归时,栈帧1,栈帧2,栈帧4不断被压入系统栈中,调用4的左右子节点时,由于return,这时候会被弹出栈,当右节点被弹出栈时,栈帧4执行完,被系统系统自动弹出栈。此时调用栈帧2,由于栈帧2为执行完毕,且程序计数器记录当前栈帧的执行位置,所以当栈帧4弹出后,会继续往下调用节点5,而不是调用节点4.
一开始是因为面试要学JVM,一直不知道为什么要学,只能说你学过的知识会在某一时刻回馈你。