二叉树前序遍历​​​​​​​到底部为何会返回到顶部?函数调用栈

前序遍历是一种二叉树的遍历方式,其遍历顺序是先访问根节点,然后递归地遍历左子树,最后递归地遍历右子树。具体来说,前序遍历的顺序是根节点->左子树->右子树。

前序遍历到底部为何会返回到顶部是因为在进行递归遍历时,每次都会先处理当前节点,然后递归地处理它的左子节点和右子节点。当递归到叶子节点时,即左右子节点为空时,递归调用会返回到上一层,继续处理上一层节点的右子节点。这样不断地递归调用直到整个树都被遍历完毕。

这种递归的方式实际上利用了函数调用栈的特性。每次递归调用都会将当前函数的状态保存在栈中,包括局部变量、函数参数等信息。当递归调用返回时,栈顶的状态会被弹出,恢复到上一次调用的状态,从而实现了递归的回溯和返回。

总之,前序遍历利用递归实现了从树的根节点开始的深度优先遍历,遍历到底部并返回到顶部是通过递归调用和函数调用栈来实现的。

函数调用栈(Function Call Stack)是计算机内存中用于管理函数调用和返回的一种数据结构。它是一种后进先出(LIFO)的栈结构,用于存储函数调用的上下文信息。每当程序调用一个函数时,该函数的调用信息(包括参数、局部变量、返回地址等)都会被压入栈顶,形成一个新的栈帧(Stack Frame)。当函数执行完毕返回时,相应的栈帧就会被弹出,控制权返回给调用函数。

函数调用栈的主要作用有以下几点:

  1. 存储函数调用的上下文信息:每个栈帧都包含了函数调用所需的所有信息,包括参数、局部变量、返回地址等。
  2. 实现函数的嵌套调用当一个函数内部调用另一个函数时,调用信息会被压入栈顶,保证了函数调用的嵌套顺序。
  3. 支持函数的递归调用:当一个函数递归地调用自身时,每次调用都会创建一个新的栈帧,保证了递归调用的正确执行。

-----------

函数调用 preorderTraversalLeftSubtree(root->left) 中,假设 root->left 指向的节点不为空,这个函数调用会如何压栈呢?

首先,当程序执行到这行代码时,会将函数调用信息压入函数调用栈。这个函数调用信息包括函数的参数、局部变量和返回地址等。

假设 root->left 指向的节点不为空,那么会执行 preorderTraversalLeftSubtree(root->left) 函数。这个函数会继续递归调用 preorderTraversalLeftSubtree 函数,传入 root->left 指向的节点作为参数。

这个过程会一直递归下去,直到遇到叶子节点,即节点的左右子节点均为空在叶子节点的情况下,递归调用会停止,函数调用栈不再继续压栈,而是开始弹栈。

弹栈的过程中,每个函数调用完成后会将相应的函数调用信息从栈顶弹出,控制权返回到调用它的函数。这样依次弹栈,直到栈为空,整个递归调用过程结束。

因此,在这个过程中,函数调用栈的压栈和弹栈是通过递归调用的方式来实现的。每次递归调用都会将函数调用信息压入栈顶,每次函数调用完成后又会从栈顶弹出相应的函数调用信息。

#include <iostream>
#include <conio.h>  // 用于 _getch() 函数using namespace std;// 定义二叉树节点结构
struct TreeNode {int value;TreeNode *left;TreeNode *right;TreeNode(int x) : value(x), left(nullptr), right(nullptr) {}
};// 函数用于前序遍历根节点及其左子树的所有节点
void preorderTraversalLeftSubtree(TreeNode* node) {if (node != nullptr) {// 访问当前节点cout << node->value << " ";// 递归遍历左子节点preorderTraversalLeftSubtree(node->left);// 递归遍历右子节点,但仅在左子树中preorderTraversalLeftSubtree(node->right);}
}
// 主函数
int main() {TreeNode* root = new TreeNode(1);root->left = new TreeNode(2);root->right = new TreeNode(3);root->left->left = new TreeNode(4);root->left->right = new TreeNode(5);root->right->left = new TreeNode(6);root->right->right = new TreeNode(7);root->left->left->left = new TreeNode(8);// root->left->left->right = new TreeNode(9);root->left->right->left = new TreeNode(10);// root->left->right->right = new TreeNode(11);// 调用前序遍历函数cout << "前序遍历结果:";cout << root->value << " "; // 手动输出根节点preorderTraversalLeftSubtree(root->left);  // 仅前序遍历左子树cout << endl << "请按任意键继续. . ." << endl;_getch();  // 等待用户按键return 0;
}

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/824560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

启明智显应用分享|基于ESP32-S3方案的SC01PLUS彩屏与chatgpt融合应用DEMO

今天将带大家真实体验科技与智慧的完美融合——SC01PLUS与ChatGPT的深度融合DEMO效果呈现。 彩屏的清晰显示与ChatGPT的精准回答&#xff0c;将为我们带来前所未有的便捷与高效。 SC01PLUS是启明智显基于ESP32-S3打造的一款3.5寸480*320分辨率的彩屏产品&#xff0c;您可以看…

【Git】git命令大全(持续更新)

本文架构 0.描述git简介术语 1.常用命令2. 信息管理新建git库命令更改存在库设置获取当前库信息 3.工作空间相关将工作空间文件添加到缓存区&#xff08;增&#xff09;从工作空间中移除文件&#xff08;删&#xff09;撤销提交 4.远程仓库相关同步远程仓库分支 &#xff08;持…

高版本Android studio 使用Markdown无法预览(已解决)

目录 概述 解决方法 概述 本人升级Android studio 当前版本为Android Studio Jellyfish | 2023.3.1 RC 2导致Markdown无法预览。 我尝试了很多网上的方法都无法Markdown解决预览问题&#xff0c;包括升级插件、安装各种和Markdown相关的插件及使用“Choose Boot Java Runtim…

一文了解OCI标准、runC、docker、contianerd、CRI的关系

docker和contanerd都是流行的容器运行时&#xff08;container runtime&#xff09;&#xff1b;想讲清楚他们两之间的关系&#xff0c;让我们先从runC和OCI规范说起。 一、OCI标准和runC 1、OCI&#xff08;open container initiative&#xff09; OCI是容器标准化组织为了…

利用动态规划优化10年投资回报:策略、证明与算法分析

利用动态规划优化10年投资回报&#xff1a;策略、证明与算法分析 a. 存在最优投资策略的证明b. 最优子结构性质的证明c. 最优投资策略规划算法设计d. 新限制条款下最优子结构性质的证明 在面对投资策略规划问题时&#xff0c;我们的目标是在10年后获得最大的回报。Amalgamated投…

牛客 NC205 跳跃游戏(三)【中等 贪心 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/14abdfaf0ec4419cbc722decc709938b 思路 参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可*** …

Go 单元测试之Mysql数据库集成测试

文章目录 一、 sqlmock介绍二、安装三、基本用法四、一个小案例五、Gorm 初始化注意点 一、 sqlmock介绍 sqlmock 是一个用于测试数据库交互的 Go 模拟库。它可以模拟 SQL 查询、插入、更新等操作&#xff0c;并且可以验证 SQL 语句的执行情况&#xff0c;非常适合用于单元测试…

基于SpringBoot+Vue社区医院服务平台(源码+文档+包运行)

一.系统概述 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了社区医院信息平台的开发全过程。通过分析社区医院信息平台管理的不足&#xff0c;创建了一个计算机管理社区医院信息平台的方案。文章介绍了社区医院信息…

如何在Linux CentOS部署宝塔面板并实现固定公网地址访问内网宝塔

文章目录 一、使用官网一键安装命令安装宝塔二、简单配置宝塔&#xff0c;内网穿透三、使用固定公网地址访问宝塔 宝塔面板作为建站运维工具&#xff0c;适合新手&#xff0c;简单好用。当我们在家里/公司搭建了宝塔&#xff0c;没有公网IP&#xff0c;但是想要在外也可以访问内…

QAnything部署Mac m1环境

本次安装时Qanything已经更新到了v1.3.3&#xff0c;支持纯python安装。安装过程比较简单&#xff0c;如下&#xff1a; QAnything/README_zh.md at qanything-python-v1.3.1 netease-youdao/QAnything GitHub 首先需要用Anaconda3创建隔离环境&#xff0c;简要说明下Anaco…

春藤实业启动SAP S/4HANA Cloud Public Edition项目,与工博科技携手数字化转型之路

3月11日&#xff0c;广东省春藤实业有限公司&#xff08;以下简称“春藤实业”&#xff09;SAP S/4HANA Cloud Public Edition&#xff08;以下简称“SAP ERP公有云”&#xff09;项目正式启动。春藤实业董事长陈董、联络协调项目经理慕总、内部推行项目经理陈总以及工博董事长…

酒店水电能源计量管理系统

酒店水电能源计量管理系统是一种针对酒店行业设计的能源管理系统&#xff0c;旨在实现对水电能源的计量、监测和管理。本文将从系统特点、构成以及带来的效益三个方面展开介绍。 系统特点 1.多元化计量&#xff1a;该系统能够对酒店内的水、电能源进行多元化计量&#xff0c;…

软件项目总体测试计划(Word原件2024)

一、 前言 &#xff08;一&#xff09; 背景 &#xff08;二&#xff09; 目的 &#xff08;三&#xff09; 测试目标 &#xff08;四&#xff09; 适用范围与读者对象 &#xff08;五&#xff09; 术语与缩写 二、 软件测试实施流程 &#xff08;一&#xff09; 测试工作总体流…

2024年MathorCup数学建模C题物流网络分拣中心货量预测及人员排班解题文档与程序

2024年第十四届MathorCup高校数学建模挑战赛 C题 物流网络分拣中心货量预测及人员排班 原题再现&#xff1a; 电商物流网络在订单履约中由多个环节组成&#xff0c;图1是一个简化的物流网络示意图。其中&#xff0c;分拣中心作为网络的中间环节&#xff0c;需要将包按照不同流…

【Python基础】MySQL

文章目录 [toc]创建数据库创建数据表数据插入数据查询数据更新 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python基础 学习指南&#xff1a;Python学习指南 创建数据库 import pymysqldef create_database():db pymysql.connect(hostlocalhost, userroot, passwordr…

Maven多模块管理

Maven多模块管理 在了解怎么进行Maven多模块管理之前&#xff0c;先聊聊为什么要进行Maven多模块管理 为什么要Maven多模块管理&#xff1f; 在传统的单体架构开发下&#xff0c;一个项目中的依赖只需要使用一个pom.xml文件管理即可。但是随着微服务的流行&#xff0c;将原有…

【IT运维入门(ITHW)系列】之「快速部署」第二期清单(持续更新)

ITHW是Information Technology Hello World的缩写简拼。意在提供IT领域的入门相关知识&#xff0c;近期给大家带来的是主流技术选型的快速部署系列&#xff0c;意在最大程度地简化部署过程&#xff0c;以便能快速体验或测试相关技术选型。 「快速部署」第一期清单 ITHW快捷部署…

Python零基础从小白打怪升级中~~~~~~~多线程

线程安全和锁 一、全局解释器锁 首先需要明确的一点是GIL并不是Python的特性&#xff0c;它是在实现Python解析器(CPython)时所引入的一个概念。 GIL全称global interpreter lock&#xff0c;全局解释器锁。 每个线程在执行的时候都需要先获取GIL&#xff0c;保证同一时刻只…

MR-JE-70A 三菱MR-JE伺服驱动器(750W通用型)

三菱MR-JE伺服驱动器(750W通用型) MR-JE-70A外部连接,MR-JE-70A用户手册,MR-JE-70A 三相或单相AC220V三菱通用型伺服放大器750W&#xff0c;配套电机HG-SN52J-S100、HG-KN73J-S100。 MR-JE-70A参数说明&#xff1a;伺服驱动器通用型750W&#xff0c;三相或单相AC200V~240V 三…

Dual-AMN论文阅读

Boosting the Speed of Entity Alignment 10: Dual Attention Matching Network with Normalized Hard Sample Mining 将实体对齐速度提高 10 倍&#xff1a;具有归一化硬样本挖掘的双重注意力匹配网络 ABSTRACT 寻找多源知识图谱(KG)中的等效实体是知识图谱集成的关键步骤&…