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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 【栈的应用】二叉树非递归中序遍历思想解析及代码实现

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

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

根据这个步骤,非递归中序遍历的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. }

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


相关文章
|
5天前
|
编译器 PHP 开发者
PHP 8新特性解析与实战应用####
随着PHP 8的发布,这一经典编程语言迎来了诸多令人瞩目的新特性和性能优化。本文将深入探讨PHP 8中的几个关键新功能,包括命名参数、JIT编译器、新的字符串处理函数以及错误处理改进等。通过实际代码示例,展示如何在现有项目中有效利用这些新特性来提升代码的可读性、维护性和执行效率。无论你是PHP新手还是经验丰富的开发者,本文都将为你提供实用的技术洞察和最佳实践指导。 ####
17 1
|
11天前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
15天前
RS-485网络中的标准端接与交流电端接应用解析
RS-485,作为一种广泛应用的差分信号传输标准,因其传输距离远、抗干扰能力强、支持多点通讯等优点,在工业自动化、智能建筑、交通运输等领域得到了广泛应用。在构建RS-485网络时,端接技术扮演着至关重要的角色,它直接影响到网络的信号完整性、稳定性和通信质量。
|
16天前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
50 2
|
22天前
|
自然语言处理 并行计算 数据可视化
免费开源法律文档比对工具:技术解析与应用
这款免费开源的法律文档比对工具,利用先进的文本分析和自然语言处理技术,实现高效、精准的文档比对。核心功能包括文本差异检测、多格式支持、语义分析、批量处理及用户友好的可视化界面,广泛适用于法律行业的各类场景。
|
5天前
|
存储 供应链 算法
深入解析区块链技术的核心原理与应用前景
深入解析区块链技术的核心原理与应用前景
23 0
|
7天前
|
存储 监控 API
深入解析微服务架构及其在现代应用中的实践
深入解析微服务架构及其在现代应用中的实践
19 0
|
16天前
|
存储 供应链 物联网
深入解析区块链技术的核心原理与应用前景
深入解析区块链技术的核心原理与应用前景
|
16天前
|
存储 供应链 安全
深度解析区块链技术的核心原理与应用前景
深度解析区块链技术的核心原理与应用前景
24 0
|
20天前
|
SQL 监控 安全
员工上网行为监控软件:SQL 在数据查询监控中的应用解析
在数字化办公环境中,员工上网行为监控软件对企业网络安全和管理至关重要。通过 SQL 查询和分析数据库中的数据,企业可以精准了解员工的上网行为,包括基础查询、复杂条件查询、数据统计与分析等,从而提高网络管理和安全防护的效率。
26 0

推荐镜像

更多