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

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

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

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

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

函数调用栈(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;您可以看…

32、模拟队列

模拟队列 题目描述 实现一个队列&#xff0c;队列初始为空&#xff0c;支持四种操作&#xff1a; (1) “push x” – 向队尾插入一个数x&#xff1b; (2) “pop” – 从队头弹出一个数&#xff1b; (3) “empty” – 判断队列是否为空&#xff1b; (4) “query” – 查询…

【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…

yolov5 自训练pt模型转onnx,再转rknn,并部署 注意事项

yolov5 部署到rk3588 教程来自 yolov5训练pt模型并转换为rknn模型&#xff0c;部署在RK3588开发板上——从训练到部署全过程_yolov5 rknn-CSDN博客 1.通过android studio 部署代码在rk3588板子上运行代码 项目来源 rknn-toolkit2/rknpu2/examples/rknn_yolov5_android_apk…

使用AWK进行文本处理

awk 的基本概念 awk 是一种强大的文本处理语言&#xff0c;广泛用于模式匹配和数据提取。这种编程语言设计用于对文本文件进行操作&#xff0c;尤其适用于格式化的文本&#xff0c;如 CSV 或空格分隔的表格数据。下面详细介绍 awk 的一些基本概念&#xff1a; 1. 记录和字段 …

一文了解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投…

Java上传文件到服务器

1、使用jsch <!--sftp文件上传--><dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version></dependency> 2、配置类 package com.base.jsch;import lombok.Data; import o…

数据结构与算法-哈希表

哈希表 哈希表&#xff08;hash table&#xff09;&#xff0c;又称散列表&#xff0c;它通过建立键 key 与值 value 之间的映射&#xff0c;实现高效的元素查询。具体而言&#xff0c;我们向哈希表中输入一个键 key &#xff0c;则可以在 时间内获取对应的值 value 。 1.基础…

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

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

搜维尔科技:Manus Xsens Metagloves新一代手指捕捉

Manus Xsens Metagloves新一代手指捕捉 搜维尔科技&#xff1a;Manus Xsens Metagloves新一代手指捕捉

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;项目正式启动。春藤实业董事长陈董、联络协调项目经理慕总、内部推行项目经理陈总以及工博董事长…

SQLAlchemy批量更新

在 SQLAlchemy 1.4 版本中&#xff0c;批量更新仍然是一个常见的需求。虽然 SQLAlchemy 1.4 引入了一些新功能和改进&#xff0c;但基本的批量更新策略与之前的版本相似。以下是一些在 SQLAlchemy 1.4 中执行批量更新的常见方法&#xff1a; 1. 使用 update() 语句 你可以使用…

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

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

第3章 网络基础知识

aws入门篇 03.IP地址与CIDR_哔哩哔哩_bilibili 3.1 IP地址 相当于互联网上的门牌号码&#xff0c;分为ipv4/ipv6&#xff0c;ipv6就是为了解决ipv4的地址耗尽问题的。 v4是1个32位的地址空间192.168.0.1&#xff08;更应该看作是2进制&#xff09; v6是1个128位的地址空间 20…