递归函数中的return?

刚接触算法时,遇到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,一直不知道为什么要学,只能说你学过的知识会在某一时刻回馈你。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值