中序,后序非递归遍历

二叉树前序、中序、后序遍历非递归写法的透彻解析 前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历。递归写法,只要理解思想,几行代码。可是非递归写法却很不容易。这里特地总结下,透彻解析它们的非递归写法。其中,中序遍历的非递归写法最简单,后序遍历最难。我们的讨论基础是这样的: 阅读详情
//后序:
 template <class T>
  void postOrder(TreeNode<T> *root)
  {
   stack<TreeNode<T>*> st;
   TreeNode<T> *p = root;
   TreeNode<T> *pre = NULL;//pre表示最近一次访问的结点
   while(p || st.size()!=0)
   {
   //沿着左孩子方向走到最左下 。
   while(p)
   {
   st.push(p);
   p = p->left;
   }
   //get the top element of the stack
   p = st.top();
   //如果p没有右孩子或者其右孩子刚刚被访问过
   if(p->right == NULL || p->right == pre)
   {
   //visit this element and then pop it
   cout << "visit: " << p->data << endl;
   st.pop();
   pre = p;
   p = NULL;
   
   }
   else
   {
   p = p->right;
   
   }
   }//end of while(p || st.size()!=0)
  }


 

  二叉树是很有用的一种数据结构,遍历则是其基本操作,这里列出实是保证完整性。几个备用的结构定义和函数:

//二叉树节点定义

class TreeNodeElement

{

       public:

              TreeNodeElement();

 

              TreeNodeElement(int value);

             

              TreeNodeElement(int value,TreeNodeElement* l,TreeNodeElement* r);

 

              ~TreeNodeElement();

 

       private:

       public:

              int _value;

 

              TreeNodeElement* _l;

 

              TreeNodeElement* _r;

};

 

typedef TreeNodeElement* TreeNode;

//递归实现(visit)

void Visit(TreeNode node)

{

       cout<<node->_value<<" ";

}

       二叉树中序遍历的递归和非递归实现:

//递归遍历

void BinRetriveATree(TreeNode root,void (* visit)(TreeNode))

{

       if (root)

       {

              BinRetriveATree(root->_l,visit);

              (*visit)(root);

              BinRetriveATree(root->_r,visit);

       }

      

}

//非递归遍历,添加#include <stack>

void BinRetriveATreeWithoutRecurve(TreeNode root,void (* visit)(TreeNode))

{

       stack<TreeNode> tree;

 

       while ((root != NULL) || (!tree.empty()))

       {

              while (root != NULL)

              {

                     tree.push(root);

 

                     root = root->_l;

              }

 

              if (!tree.empty())

              {

                     root = tree.top();

 

                     tree.pop();

 

                     visit(root);

                    

                     root = root->_r;   //转到右子树

 

              }

       }

}

 

 

二叉树后序遍历的递归和非递归实现:

//递归遍历

void PostRetriveATree(TreeNode root,void (* visit)(TreeNode))

{

       if (root)

       {

              PostRetriveATree(root->_l,visit);

              PostRetriveATree(root->_r,visit);

              (*visit)(root);

       }

}

//非递归遍历,添加#include <stack>

void PostRetriveATreeWithoutRecurve(TreeNode root,void (* visit)(TreeNode))

{

       stack<TreeNode> tree;

 

       while ((root != NULL) || (!tree.empty()))

       {

              while (root != NULL)

              {

                     tree.push(root);

 

                     root = root->_l;

              }

 

              if (!tree.empty())

              {

                     root = tree.top();

 

                     if (root->_tag)  //可以访问

                     {

                            visit(root);

 

                            tree.pop();

                           

                            root = NULL; //第二次访问标志其右子树也已经遍历

                     }

                     else

                     {

                            root->_tag = true;

                            root = root->_r;

                     }

              }

       }

}

 

C/C++ 二叉树的非递归遍历(前序、中序、后序非递归遍历) 二叉树的非递归遍历C/C++实现: 非递归先序遍历代码: void PreOrderTraversal (struct tree* root) { //非递归先序遍历 struct tree* temp = root; while (temp != NULL || S.top > 0) { while (temp != NULL) { ... 阅读详情

相关推荐

非递归实现二叉树先序、中序、后序遍历(栈实现)

本篇文章主要详解利用栈的方式二叉树先序、中序、后序遍历的非递归写法 首先我们需要实现一颗二叉树。 以下是通过先序序列建树的代码 例如:先序序列{1,2,4,10,'#','#',6,11,'#','#',7'#','#','#',3,8,'#','#',9}代表以下的树 typedef struct Node { int _data; Node* _right; Node* _left; Node() {} ...

weixin_46847295的博客 871

二叉树遍历之后序遍历(非递归、递归)入门详解

二叉树后序遍历不如先序遍历简单,是相对最复杂的一种遍历方法。访问结点的次序是:“左—>右—>根”,也就是首先访问左子树,之后访问右子树,最后访问树根。对于左、右子树而言,其访问的次序依然是“左—>右—>根”。也就是说,对于每一棵子树,都是最后访问树根。...

sunnyoldboy博客 3万+

stm32教程之三重ADC交错采样

ps:本文基于stm32F407ZGT6单片机 stm32F4单片机单通道采集的最大采样率为2.4M,所以有时会难以满足较高频率的采样,于是查阅芯片手册,发现stm32F4支持多重ADC采集,利用每个通道的转换时间,错位采样,从而提高采样率,最大把采样率开到2.4*3=7.2M. (去年初学ADC时研究的,基于cube和HAL库的三重ADC交错采样参考资料不多,我也是研究了一段时间,写下这篇博客希望可以帮助到更多人。) 示意图如下: 以下是官方例子的说明, In this ex...

weixin_52178036的博客 8874

【数据结构】二叉树遍历(前序/中序/后序/层序-递归与非递归)

数据结构:二叉树遍历(前序/中序/后序/层序-递归与非递归)

金哥的博客 1万+

UE5高斯泼溅落地全链路:从PLY导入到实时渲染的工程实践

3D高斯泼溅(3D Gaussian Splatting)正从NeRF后处理技术演进为新一代隐式几何渲染范式,其核心在于以可微椭球体替代传统三角面片,通过协方差矩阵与球谐系数实现高质量体素化渲染。该技术突破点云精度瓶颈,但与UE5现有资产管线存在根本性不兼容——静态网格导入器无法解析scale/rot/sh系数等非标顶点语义,标准光栅化管线亦无法执行高斯核采样计算。XV3DGS-UEPlugin通过自定义资产类型、StructuredBuffer GPU数据流与专用材质节点,将高斯泼溅重构为可编辑、可LOD

weixin_33692177的博客 357

C语言手写HTTPD网站服务器

零基础手写C语言http网站服务器,快速入门C/C++后端开发、服务器开发。

程序员Rock的博客 1万+

后序遍历非递归算法

后序遍历 方法一: //后序遍历 void PostOrderWithoutRecursion(BTNode* root) { if (root == NULL) return; stack<btnode*> s; //pCur:当前访问节点,pLastVisit:上次访问节点 BTNode* pCur, *pLastVisit; ...

行走巨人国 1万+

Redis【实战篇】---- 分布式锁-redission

重入问题:重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,比如HashTable这样的代码中,他的方法都是使用synchronized修饰的,假如他在一个方法内,调用另一个方法,那么此时如果是不可重入的,不就死锁了吗?所以可重入锁他的主要意义是防止死锁,我们的synchronized和Lock锁都是可重入的。不可重试:是指目前的分布式只能尝试一次,我们认为合理的情况是:当线程在获得锁失败后,他应该能再次尝试获得锁。

是微风,是晚霞,是无可替代 1万+

后序遍历的非递归方式实现

【问题描述】已知二叉树的先序遍历序列和中序遍历序列(二叉树中元素类型为字符类型),输出该二叉树的后序遍历序列(采用非递归方式实现)。【样例输入】ABDEGICFH DBGIEAFHC。【输入形式】二叉树的先序序列 二叉树的中序序列。【输出形式】二叉树的后序序列。

m0_75017568的博客 1129

9、 量子支持向量机:从经典到量子的跨越

本文详细介绍了量子支持向量机(QSVM)的基本原理及其在PennyLane和Qiskit框架中的实现方法。从经典SVM的基础知识出发,逐步深入到量子领域的应用,包括如何定义量子核函数、与scikit-learn集成以及在模拟器和实际量子计算机上的训练和评估过程。最后通过表格和流程图总结了不同框架下的实现要点,为未来量子机器学习的研究提供了参考。

weixin_42433737的博客 183

我用 Python 把 Claude 变成了 “代码审查员“:每次提交前 AI 先 Review,Bug 漏网率降了 80%

这是成败的关键。我们需要给 Claude 立规矩,让它像一个严格的架构师那样思考。你是一名资深的首席软件架构师和安全专家。请审查以下 Git Diff 代码变更。你的任务是:1. **安全性检查**:寻找 SQL 注入、XSS、硬编码密钥、敏感信息泄露等。2. **潜在 Bug**:空指针、资源未关闭、竞态条件、逻辑死循环。3. **代码质量**:命名规范、冗余代码、可读性差、缺乏注释。4. **性能优化**:不必要的数据库查询、低效算法。

BUG猿的博客 142

后序遍历之非递归实现

后序遍历之非递归实现

小汤圆 1541

【C++实战(62)】从0到1:C++打造TCP网络通信实战指南

本文是 C++ 网络编程实战专栏第 62 篇,聚焦 TCP 客户端与服务端开发。先阐述 TCP 协议特点、核心 API 及阻塞与非阻塞 IO 区别,打牢基础;再详解 TCP 服务端初始化、客户端连接处理与数据收发,以及客户端初始化、异常处理和协议设计;最后通过简易聊天系统实战,介绍线程池应用、协议解析及稳定性测试,助力开发者掌握 TCP 网络编程实操技能。

邓邓子的博客 999

二叉树的先序,中序,后序遍历(非递归算法)

二叉树的先中后序遍历的非递归算法都和栈有关,栈的相关操作请点此查看。①先序遍历思路一:先将根结点进栈,当栈不为空时,出栈并访问,然后依次将右左结点进栈(栈先进后出,所以先进栈右结点)。顺序栈类型:typedef struct { Btnode *data[MaxSize]; int top; }Sqstack;思路一的实现:void PreOrder(Btnode *b) { Btnode ...

Gsdxiaohei 4843

第三章-python基础语法

有C语言基础应该这样学 Python。

qq_46187594的博客 1175

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C语言实现非递归先序、中序、后序遍历

C语言实现非递归先序、中序、后序遍历

呵呵哒!的博客 7184

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

先序、中序、后序遍历的非递归算法

先序、中序、后序遍历的非递归算法先序遍历中序遍历后序遍历 先序遍历 第一次遇到该结点时输出 public void preOrder(TreeNode root){ if(root==null) return; TreeNode p = root; Stack<TreeNode> stack = new Stack<>(); while(!stack.is...

不想秃头的女ITer的博客 2332

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

递归和非递归方式实现二叉树的先序、中序和后序遍历

二叉树的递归实现和非递归实现、递归序

明朗晨光的专栏 2459

二叉树的先序、中序、后序遍历的递归和非递归实现

#include "stdafx.h" #include using namespace std; const int MAXSIZE = 20; //定义栈空间大小为20 struct BTNode { char m_value; BTNode *m_left; BTNode *m_right; }; BTNode *stackArr[MAXSIZE] =

5224

C++实现二叉树的先序、中序、后序遍历,包括递归方式和非递归 方式

C++实现二叉树的先序、中序、后序遍历,包括递归方式和非递归方式。 1. 二叉树的基本结构 struct Node { int value; Node* left; Node* right; Node(int value): value(value), left(nullptr), right(nullptr) {} }; 2. 递归和非递归方...

暮日落流年的博客 1万+

二叉树先序、中序、后序遍历的递归和非递归实现

二叉树的六种遍历方式(其中控制台输出代表访问) 1.递归先序 public void recursion_pre(TreeNode root) { if (root==null) return; System.out.print(root.val); recursion_pre(root.left); ...

dao_lian的博客 521

Python 二叉树先序中序后序遍历 非递归

先序遍历二叉树非递归 类似递归的思想,遇到一个节点先打印出来,然后依次访问左右节点。但是非递归借助栈来实现有所不同,应该先打印当前节点,然后依次入栈右节点和左节点,因为此时栈的插入顺序和弹出顺序相反。 节点的结构: class TreeNode: def __init__(self, x): self.val = x se...

James_J的博客 2309

二叉树先序,中序,后序遍历非递归实现

利用栈实现二叉树的先序,中序,后序遍历的非递归操作 #include #include #include #include #include #include using namespace std; typedef struct BiTNode{ char data; BiTNode *lchild, *rchild; }BiTNode,*BiTree;

cxllyg的专栏 8万+

二叉树非递归先序、中序、后序遍历过程详解及C++详细实现

数据结构,二叉树非递归先序、中序、后序遍历过程详解及C++详细实现

weixin_45651616的博客 3057

二叉树的先序,中序,后序遍历(非递归算法)

二叉树的非递归前、中、后序遍历算法详解及代码实现(C语言) 1. 前序遍历和中序遍历非递归算法思路 前序和中序非递归遍历的C代码 2. 后序遍历非递归算法思路 后序非递归遍历的C代码 1. 前序遍历和中序遍历非递归算法思路 遍历过程:(如图所示) 图1 前序遍历和中序遍历流程图 从当前节点开始遍历:(当入栈时访问节点内容,则为前序遍历;出栈时访问,则为中序遍历) 1. 若当前节点存在,就存入栈中,并访问左子树; 2. 直到当前节点不存在,就出栈,并通过栈顶节点访问右子树; 3.

weixin_44203609的博客 4464
上一篇: [classic aglo]-quick sort 纯净版
下一篇: [classic algo]-heap sort 堆排序
NEOMc
博客等级 码龄17年 36粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值