C++树节点递归函数工作机制及节点打印逻辑疑问
递归遍历树的执行逻辑解析
当
recursion(head->left)最终指向NULL时,肯定会回到当前递归状态的head->value执行cout打印。
递归靠函数栈保存每一层的调用状态:调用recursion(head->left)时,当前处理该head的递归函数会暂停,把当前head变量、接下来要执行的位置(就是cout那一行)压入栈,转而去执行左子树的递归。当左子树递归到NULL时,空节点的递归函数直接返回,栈会弹出上一层的状态,回到之前暂停的地方,继续执行cout语句,打印当前head的value。recursion(head->right)遵循完全相同的逻辑。
当前节点的cout执行完后,会调用recursion(head->right),同样当前函数暂停压栈,去处理右子树的递归。只有当右子树的所有递归都执行完毕返回后,当前这一层的递归函数才会彻底结束,回到上一层的调用点。最后一个左节点的打印逻辑:
比如树是根节点→左子节点→最左叶子节点的结构,当递归到最左叶子节点时,它的head->left是NULL,所以recursion(head->left)直接返回,此时回到这个叶子节点的递归函数,执行cout打印它的value;之后再处理它的右子树(如果存在的话),处理完右子树后,这个叶子节点的递归函数结束,回到父节点,继续执行父节点的cout,以此类推。
举个对应代码示例(中序遍历场景):
void recursion(TreeNode* head) { if (head == NULL) return; recursion(head->left); cout << head->value << endl; // 最左节点的value会在这里被打印 recursion(head->right); }
内容的提问来源于stack exchange,提问作者Parker
相关产品推荐
相关产品推荐

