【栈的应用】二叉树非递归中序遍历思想解析及代码实现

简介: 【栈的应用】二叉树非递归中序遍历思想解析及代码实现

中序遍历的思想是在第二次经过结点的时候才去访问结点数据,要一直去寻找结点的左子树,访问完左子树在返回结点并获取结点数据,然后访问右子树,重复这个过程,也就是说如果当前结点有左子树就要转去左子树,访问完左子树才访问当前结点,这个场景刚好可以使用栈来实现,有左子树则把当前结点入栈,访问完左子树,再出栈并访问结点数据。非递归遍历算法的思想如下:

  • 步骤一:
  • 定义一个当前指针,并指向根结点,当前指针指向的结点称为当前结点;
  • 步骤二:
  • 如果当前结点有左子树,那么当前结点入栈,当前指针指向当前结点的左子树;
  • 如果当前结点没有左子树,访问当前结点数据;
  • 步骤三:
  • 当前结点右子树非空,当前指针指向当前结点右子树,转步骤二;
  • 当前结点右子树为空且栈非空,返回并弹出栈顶元素给当前指针,访问当前结点,当前指针指向当前结点右子树,转步骤二;
  • 当前结点右子树为空,且栈为空,遍历结束。

根据这个步骤,非递归中序遍历的C++代码实现如下:

1. void nonrecursive_traversal(MyTreeNode* tree)
2. {
3.  stack<MyTreeNode*> s;
4.  MyTreeNode* pStart = tree;
5.  while (pStart->left != NULL)
6.  {
7.    //有左子树
8.    s.push(pStart); //根结点入栈
9.    pStart = pStart->left; //指针下移,指向左子树
10.   }
11.   while (pStart != NULL)
12.   {
13.     cout << pStart->data << " "; //没有左子树则访问
14.     if (pStart->right != NULL)
15.     {
16.       //右子树非空
17.       pStart = pStart->right;
18.       while (pStart->left != NULL)
19.       {
20.         //有左子树
21.         s.push(pStart); //根结点入栈
22.         pStart = pStart->left; //指针下移,指向左子树
23.       }
24.     }
25.     else if ((pStart->right == NULL) && (!s.empty()))
26.     {
27.       //右子树为空,且栈非空
28.       pStart = s.top();
29.       s.pop();
30.     }
31.     else
32.     {
33.       //右子树为空,且栈为空
34.       pStart = NULL;
35.     }
36.   }
37. }

下面创建一棵树来测试一下算法,二叉树如下


相关文章
|
算法 PyTorch 算法框架/工具
昇腾 msmodelslim w8a8量化代码解析
msmodelslim w8a8量化算法原理和代码解析
1082 5
|
机器学习/深度学习 文字识别 监控
安全监控系统:技术架构与应用解析
该系统采用模块化设计,集成了行为识别、视频监控、人脸识别、危险区域检测、异常事件检测、日志追溯及消息推送等功能,并可选配OCR识别模块。基于深度学习与开源技术栈(如TensorFlow、OpenCV),系统具备高精度、低延迟特点,支持实时分析儿童行为、监测危险区域、识别异常事件,并将结果推送给教师或家长。同时兼容主流硬件,支持本地化推理与分布式处理,确保可靠性与扩展性,为幼儿园安全管理提供全面解决方案。
546 3
|
10月前
|
编译器 C语言 C++
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
213 0
栈区的非法访问导致的死循环(x64)
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
788 27
|
10月前
232.用栈实现队列,225. 用队列实现栈
在232题中,通过两个栈(`stIn`和`stOut`)模拟队列的先入先出(FIFO)行为。`push`操作将元素压入`stIn`,`pop`和`peek`操作则通过将`stIn`的元素转移到`stOut`来实现队列的顺序访问。 225题则是利用单个队列(`que`)模拟栈的后入先出(LIFO)特性。通过多次调整队列头部元素的位置,确保弹出顺序符合栈的要求。`top`操作直接返回队列尾部元素,`empty`判断队列是否为空。 两题均仅使用基础数据结构操作,展示了栈与队列之间的转换逻辑。
|
供应链 项目管理 容器
深入探索 BPMN、CMMN 和 DMN:从定义到应用的全方位解析
在当今快速变化的商业环境中,对象管理组织(OMG)推出了三种强大的建模标准:BPMN(业务流程模型和符号)、CMMN(案例管理模型和符号)和DMN(决策模型和符号)。它们分别适用于结构化流程管理、动态案例处理和规则驱动的决策制定,并能相互协作,覆盖更广泛的业务场景。BPMN通过直观符号绘制固定流程;CMMN灵活管理不确定的案例;DMN以表格形式定义清晰的决策规则。三者结合可优化企业效率与灵活性。 [阅读更多](https://example.com/blog)
深入探索 BPMN、CMMN 和 DMN:从定义到应用的全方位解析
|
数据采集 机器学习/深度学习 存储
可穿戴设备如何重塑医疗健康:技术解析与应用实战
可穿戴设备如何重塑医疗健康:技术解析与应用实战
592 4
|
存储 弹性计算 安全
阿里云服务器ECS通用型规格族解析:实例规格、性能基准与场景化应用指南
作为ECS产品矩阵中的核心序列,通用型规格族以均衡的计算、内存、网络和存储性能著称,覆盖从基础应用到高性能计算的广泛场景。通用型规格族属于独享型云服务器,实例采用固定CPU调度模式,实例的每个CPU绑定到一个物理CPU超线程,实例间无CPU资源争抢,实例计算性能稳定且有严格的SLA保证,在性能上会更加稳定,高负载情况下也不会出现资源争夺现象。本文将深度解析阿里云ECS通用型规格族的技术架构、实例规格特性、最新价格政策及典型应用场景,为云计算选型提供参考。
|
人工智能 自然语言处理 算法
DeepSeek大模型在客服系统中的应用场景解析
在数字化浪潮下,客户服务领域正经历深刻变革,AI技术成为提升服务效能与体验的关键。DeepSeek大模型凭借自然语言处理、语音交互及多模态技术,显著优化客服流程,提升用户满意度。它通过智能问答、多轮对话引导、多模态语音客服和情绪监测等功能,革新服务模式,实现高效应答与精准分析,推动人机协作,为企业和客户创造更大价值。
986 5
|
机器学习/深度学习 JSON 算法
淘宝拍立淘按图搜索API接口系列的应用与数据解析
淘宝拍立淘按图搜索API接口是阿里巴巴旗下淘宝平台提供的一项基于图像识别技术的创新服务。以下是对该接口系列的应用与数据解析的详细分析

热门文章

最新文章

推荐镜像

更多
  • DNS