后序遍历的非递归算法(C 详细)
后序遍历二叉树是先访问左子树,再访问右子树,最后访问根结点。
算法思想:
- 先沿根结点,依次入栈,直到左孩子为空
- 读取栈顶元素;如果其右孩子不空且未被访问过,将右子树转执行 1;
- 否则,栈顶元素出栈并访问。
void PostOrder(BiTree T){InitStack(S);p=T;r=NULL;while(p!=NULL||!IsEmpty(s)){if(p!=NULL){ //走到最左边 push(S,p);p=p->lchild;}else{ //向右GetTop(S,p); //读栈顶节点(非出栈) if(p->rchild&&p->rchild!=r){ //若右子树存在,且未被访问过 p=p->rchild; //转向右 }else{ //否则弹出结点并访问 pop(S,p);visit(p->data); //访问该结点r=p; //记录最近访问的结点 p=NULL; //结点访问完后,重置p指针}}}
后序序列D E B C A
以此为例,按照代码推演一遍:
按照第一个if语句中的 p!=NULL 且 p=p->lchild;
依次将 ABD 入栈
此时,p指针是指向D结点的左子树,所以为空;
跳出第一个if(p!=NULL)判断
然后转到 GetTop(S,p); 语句
将p指针指向栈顶的D结点;
然而 if(p->rchild) 判断中,D也无右结点。
这时转到pop语句;将D结点作为后序遍历的第1个结点,且r指针指向D
因为p置为NULL了,所以跳转到GetTop(S,p);p指向了栈顶B结点.
可知p=p->rchild,把p指针指向了B的右结点E;(此时r指向D,p指向E)
因为p!=NULL,会push(S,p);
E结点入栈
此时堆栈情况:
因为E无左子树,同时E也无右子树,
if(p->rchild&&p->rchild!=r)
所以出栈访问,将E结点作为后序遍历的第2个结点;
r指向E结点,p置空
pop(S,p); visit(p->data); r=p; p=NULL;
之后因为r指向E,p指向B (因为GetTop(S,p);
会把p指向B)
p->rchild!=r
会阻止再次访问 访问过的结点,即E结点,所以将B出栈,将E结点作为后序遍历的第3个结点;
r指向B,p置空
接着对栈顶元素A进行判断,C结点相应入栈出栈,同理,r指针指向C,防止二次访问右子树C;
最后将A出栈,栈空,break while循环。
r指针的作用:
可以看出p指针指向栈顶元素时,如果元素存在右子树,且r指针保留了访问过的右子树,就会阻止访问,直接使栈顶元素出栈
这也是后序遍历不同于先序、中序,所要特别处理的地方。
后序遍历的非递归算法(C 详细)相关推荐
- 数据结构-----后序遍历二叉树非递归算法(利用堆栈实现)
一.非递归后序遍历算法思想 后序遍历的非递归算法中节点的进栈次数是两个,即每个节点都要进栈两次,第二次退栈的时候才访问节点. 第一次进栈时,在遍历左子树的过程中将"根"节点进栈,待 ...
- 二叉树后序遍历的非递归算法
二叉树的后序遍历的非递归算法与二叉树的先序和中序遍历的非递归算法相比稍微复杂一点. 大致思路是:如果当前结点左右子树均为空,则可以访问当前结点,或者左右子树不均为空,但是前一个访问的结点是当前结点的左 ...
- 后序遍历的非递归算法python_二叉树后序遍历(递归与非递归)算法C语言实现...
二叉树后序遍历的实现思想是:从根节点出发,依次遍历各节点的左右子树,直到当前节点左右子树遍历完成后,才访问该节点元素. 图 1 二叉树 如图 1 中,对此二叉树进行后序遍历的操作过程为: 从根节点 1 ...
- 后序遍历的非递归算法python_刷题系列 - Python用非递归实现二叉树后续遍历
顺便把Python用非递归实现二叉树后续遍历也写了. 其实前序中序和后续都是针对父节点说的.比如下面这个最简单二叉树. 前序就是ABC,父节点A在前 中序就是BAC,父节点A在中间 后序就是BCA,父 ...
- 后序遍历的非递归算法python_Python非递归实现二叉树的后续遍历
leetcode 145. Binary Tree Postorder Traversal 思路一: 使用一个栈stack保存经过的根结点,另一个栈flag保存每个结点的右子树是否遍历: 如果根结点存 ...
- 后序遍历的非递归算法python_后的解释|后的意思|汉典“后”字的基本解释
详细字义 ◎ 后 hòu 〈名〉 (1) (会意.象人之形,施令以告四方,古之,从一口,发号者君后也.按从坐人,从口,与君同意.本义:君主,帝王) (2) 同本义 [sovereign] 后,继君体也 ...
- c++ stack 遍历_五分钟C语言数据结构 之 二叉树后序遍历(非递归很重要)
五分钟C语言实现常见数据结构 今天的内容分享的是二叉树后序遍历 DP问题,欢迎关注 动态规划一篇就够了 全网最详细, 逐步理解, 万字总结 - Johngo的文章 - 知乎 https://zhuan ...
- 二叉树中序遍历的非递归算法
根据二叉树的先序遍历结果创建一棵二叉树,即先创建根结点,然后再创建左子树,最后创建右子树,对于左右子树的创建也遵循根左右的原则,所以对于左右子树的创建可以递归调用本函数,此问题是典型的需要用递归算法求 ...
- 二叉树前序、中序和后序遍历的非递归实现
1 二叉树的遍历 1.1 前序遍历 对于每棵子树,先处理根,然后处理左子树,最后处理右子树.根最先访问,所以是前序遍历. 1.2 中序遍历 对于每棵子树,先处理左子树,然后处理根,最后处理右子树.根中 ...
最新文章
- 022_applescript快速入门教程
- 计算机网络早期结构图,第21讲 计算机网络应用基础(一).ppt
- Typescript中class的extends码源分析
- arcgis python实例_arcgis二次开发_arcgis二次开发python_arcgis二次开发实例
- 三、Web服务器——HTTP协议 Response对象 ServletContext对象 学习笔记
- java线程安全定义了什么单例_Java中四种线程安全的单例模式实现方式
- SQL SERVER 2000 创建挂起的文件操作 解决方法
- Curie%20Module有什么用
- ES6字符串的扩展方法~超详细哦
- Python 类的几个内置装饰器—— Staticmethod Classmethod Property
- 用HTML写会员注册页面
- 电脑小手图标怎么去除_图文教你去除桌面图标箭头_消除电脑图标小箭头的方法-系统城...
- 机器学习岗位面试总结:简历应该关注的5个重点
- 傲腾服务器硬盘,Intel傲腾Optane硬盘实测:“高价U盘”,加速性能不错
- selenium实战爬取股票
- 【商城秒杀项目】-- 流量削峰应该怎么做
- 利用Python计算UDP校验和
- 为什么从事大数据行业,一定要学习Python?
- [Wpf] . [Theme] 重构/Themes/Generic.xaml 创建一个Custom Control的典型做法
- 战国都城形态的东西差别
热门文章
- ASO优化在大数据时代应该怎么操作,aso优化如何操作
- 学习游戏服务器开发必看,C++游戏服务器开发常用工具介绍
- VMware Tools (ubuntu系统)安装详细过程与使用
- mosquitto入门教程
- C++ vector数据合并去除重复项
- 线性代数——分块矩阵计算行列式的方法
- linux获取p12证书信息,微信公众号现金红包——.p12证书linux部署如何使用
- Eclipse的安装和使用
- 一行代码搞定Android弧形卫星动画菜单(附Demo)
- 目标检测YOLO实战应用案例100讲-基于深度学习的自动驾驶车辆三维目标检测方法研究与应用