二叉树的遍历(堆栈)

二叉树的遍历(堆栈)

如何理解用堆栈方式代替递归去遍历二叉树,关键点在于了解每个结点输出时的顺序,以及理解前序中序后序是如何遍历的,这点很重要,可以自己画一个树图,熟练写出遍历的结果
在这里插入图片描述
以上图为例,在进行先序遍历的时候,最先输出的是A,而在中序遍历的时候,A是在第四次时候才输出(DEBA)
以中序遍历为例子,我们要先遍历所有的左子树,把每个左子树上的结点存入堆栈中,然后再pop出堆栈里的结点,输出该结点,然后在判断该结点是否还有右儿子
下面的代码就是遍历所有的左子树上的结点存入堆栈中,然后依次pop出结点,判断当前结点是否存在右儿子
以上图为例,D结点虽然没有左儿子和右儿子了,但是在以链表来看,实际上D存在着为NULL的左儿子和右儿子,所以所有的叶子结点都存在值为NULL的左儿子和右儿子,E结点,F结点同理。
,在第二层循坏While§循坏完后,当前结点是D的左儿子NULL,对于A来说 B是它的左儿子,A是根节点,同理 D此时并不是叶子结点,而是 两个NULL的根节点,通过pop取出D这一个根节点
然后判断D有没有右儿子,很明显是有一个NULL的右儿子,但是这只是对于链表的存储方式来说,在真正树状图上它是不存在右儿子的,你会发现最外层循坏语句 第二次循坏的时候,pop直接取出
了B,然后p=p->right,p指向B的右儿子E,所以可以把 语句理解为判断当前结点是否有右儿子结点,没有则输出当前结点的根节点,如果有的话继续对右边的结点进行操作

void firstoder(Tree p)//传送过来的二叉树
{  PNode pile =createPNode();//创建一个堆栈pilewhile(p||!IsEmpty(pile)){while(p)//遍历左子树上的结点{push(pile,p);p=p->left;}if(!IsEmpty(pile)){p=pop(pile);printf("%d ",p->date);//输出结点的值p=p->right;}}
}

先序遍历:看图可知,A B D都是相对于自己的左子树和右子树的根节点,比如 A就是 BDE的根节点,B就是DE的根节点,D就是NULL NULL的根节点,在先序遍历的时候,根节点是最先输出的
其次是左节点和右结点,,所以在循坏的时候,就要在循坏… 遍历左子树把每个左节点存入的堆栈的时候就要输出当前的结点,也就是只用移动一下输出语句的位置就能从中序变为先序

void firstoder(Tree p)//传送过来的二叉树
{  PNode pile =createPNode();//创建一个堆栈pilewhile(p||!IsEmpty(pile)){while(p)//遍历左子树上的结点{push(pile,p);printf("%d ",p->date);p=p->left;}if(!IsEmpty(pile)){p=pop(pile);p=p->right;}}
}


接下来就是后序遍历,后续遍历顺序是左 中 右,关键点在于 我们现在处于左结点,我们需要通过上一个头节点去访问跟我们现在的左节点同一层的右结点,去输出右节点,但此时头节点已经pop出来了,所以头节点无法再访问到了,所以我们需要把头节点的值保存下来,压栈进堆栈里。

void firstoder(Tree p)//传送过来的二叉树
{  PNode pile =createPNode();//创建一个堆栈pilewhile(p||!IsEmpty(pile)){while(p)//遍历左子树上的结点{push(pile,p);printf("%d ",p->date);p=p->left;}if(!IsEmpty(pile)){Tree temp=(Tree)malloc(sizeof(struct TreeNode));//创建临时指针存储头结点p=pop(pile);temp=pop;p=p->right;temp->right=NULL;//遍历的指针指向当前结点的右儿子,把当前结点的右儿子设置NULL,防止死循环if(p)push(pile,temp);//如果当前结点存在右儿子结点,那么存储当前结点,继续遍历右子树elseprintf("%d ",temp->date);//当前结点没有右儿子,那么直接输出当前结点}}
}

我是一个小萌新,第一次写博客,写的很渣,请见谅!—

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core分布式项目实战(第三方ClientCredential模式调用)--学习笔记

任务10:第三方ClientCredential模式调用创建一个控制台程序dotnet new console --name ThirdPartyDemo添加 Nuget 包:IdentityModel添加之后还原dotnet restoreClientusing System; using System.Net.Http; using System.Threading.Tasks; using Identit…

C++ class实现邻接矩阵存储的图(完整代码)

代码如下: #include <iostream> #include <queue> using namespace std; typedef int VertexType; typedef int EdgeType; const int MaxVertexNum 30;class MGraph { public:MGraph(){CreatGraph();};void CreatGraph();void Visit(int v);void BFS(int v);void…

二叉搜索树(创建,插入,删除):基础篇,适合新手观看。

1.1 二叉搜索树的插入 二叉搜索树的概念相信大家都很清楚&#xff0c;无非就是左小右大 创建二叉搜索树&#xff0c;其实就是多次调用二叉搜索树的插入方法&#xff0c;所以首先我们来讲讲如何插入节点到二叉搜索树里&#xff0c;假设一颗二叉搜索树如下&#xff0c;现在要插入…

.NET 的过去、现在和未来

作为一名使用了十多年.NET 开发平台的开发者来说&#xff0c;多年来笔者鲜少在各类博客媒体推广布道 .NET平台&#xff0c;但也默默地关注着 .NET 平台的发展变化&#xff0c;为每一次新技术的出现欢呼&#xff0c;为近年来 .NET 的沉默感到惋惜&#xff0c;也为开放开源的 .NE…

AVL树(平衡二叉树)讲解,入门篇,适合新手观看

1.1 概念 平衡二叉树就是为了让二叉搜索树的平均查找长度更短&#xff0c;时间复杂度更靠近logN,如果一个二叉搜索树不平衡了就会出现图1情况&#xff0c;完全变成一个数组&#xff0c;时间复杂度也变为了O(N)。 平衡因子&#xff1a;平衡因子就是针对于树中某一结点&#xff…

读源码,对开发者重要吗?

.NET 5.0 Peview 2发布4月2日&#xff0c;微软发布了.NET 5.0 Preview 2&#xff0c;带来功能和性能方面的改进。这一版本包括.NET 5.0.0 Preview 2与.NET SDK 5.0.100 Preview 2。.NET 5是.NET Framework和.NET Core的未来&#xff0c;最终将成为一个统一平台&#xff0c;.NET…

Redis和DB数据一致性解决方案

问题出现原因 并发时候无法保证读写的先后顺序&#xff0c;如果删掉了缓存还没来得及写库&#xff0c;另外一个县城就多来读取&#xff0c;发现缓存为空就去读取数据库并且写入缓存&#xff0c;这时候缓存中就是脏数据如果先写库&#xff0c;在删除缓存前&#xff0c;写库的线…

数据结构堆的时间复杂度(最大堆,最小堆)

创建堆的方式有两种&#xff0c;一种是一边插入结点&#xff0c;一边调用堆的插入方法调整堆&#xff0c;这样的时间复杂度就是 O(NlogN)&#xff0c;而第二种方式就把时间复杂度缩减到了O(N)&#xff0c;它是采用先把结点插入好了&#xff0c;然后再来调整堆&#xff0c;并不是…

中国速度之二神山建设(3):有力的技术保障,基建世界里的云原生缩影 | IDCF DevOps案例研究...

内容来源&#xff1a;DevOps案例深度研究第4期 – 火神山雷神山 DevOps实践研究战队&#xff08;本文只展示部分PPT及研究成果&#xff0c;全程视频请移步文末&#xff09;本案例内容贡献者&#xff1a;赖泽薇、张扬、邓茜芸、韦一、刘德权、候利涛、冯利娟、常相宇、张力、韩丰…

Rx2.0后台开发分享

Rxjava2.x 微软的一个函数库&#xff0c;Rx是一个编程模型&#xff0c;模板是提供一致的编程接口&#xff0c;帮助开发者更方便的处理异步数据流&#xff0c;现在Rx已经支持几乎全部的流行编程语言。比较流行的有Rxjava&#xff0c;RxJs&#xff0c;Rx.NET&#xff0c;社区网站…

中国速度之二神山建设(4):全能运维,召之即来,来之即战 | IDCF DevOps案例研究...

内容来源&#xff1a;DevOps案例深度研究第4期 – 火神山雷神山 DevOps实践研究战队&#xff08;本文只展示部分PPT及研究成果&#xff0c;全程视频请移步文末&#xff09;本案例内容贡献者&#xff1a;赖泽薇、张扬、邓茜芸、韦一、刘德权、候利涛、冯利娟、常相宇、张力、韩丰…

Spring Cloud部分源码分析Eureka,Ribbon,Feign,Zuul

Eureka SpringCloud Eureka使用NetFlix Eureka来实现的&#xff0c;它包括了服务端组件和客户端组件&#xff0c;并且都是用java 编写的。 Eureka服务端就是服务注册中心&#xff0c;Eureka客户端主要处理服务的注册发现&#xff0c;通过注解和参数配置的方式&#xff0c;客户…

C++ class实现邻接表存储的图(完整代码)

代码如下: #include <iostream> #include <queue>using namespace std; const int MaxVertexNum 30; typedef int InfoType; typedef int VertexType;class Node {friend class VNode;friend class ALGraph; private:int adjvertex;InfoType info;Node *next; };…

世界上首个被数学证明安全的OS微内核seL4成立基金会

Linux 基金会正在与澳大利亚国家科学机构 CSIRO 合作&#xff0c;打造 seL4 操作系统微内核生态。近日 Linux 基金会宣布托管 seL4 基金会&#xff0c;该基金会以澳大利亚国家科学机构 CSIRO 的数字机构 Data61 创建的 seL4 操作系统微内核为基础项目。seL4 是一个安全操作系统…

数据结构(哈夫曼树,哈夫曼编码)入门篇,JAVA实现

什么是哈夫曼树 哈夫曼树就是一种最优判定树&#xff0c;举个例子&#xff0c;如下一个判断逻辑 if(s<60) g1; else if(s<70) g2 else if(s<80) g3 else if(s<90) g4 else g5; 分数概率图如下 如果按照代码从上到下顺序构造判定树&#xff0c;那么如下图所示&am…

C++ class实现十字链表存储的图(完整代码)

代码如下: #include <iostream> #include <queue> using namespace std; typedef int InfoType; typedef int VertexType; const int MaxVertexNum 30;class ArcNode {friend class OLGraph;friend class VertexNode; private:int tailvertex, headvertex;ArcNod…

hystrix隔离策略对比

hystrix隔离策略 zuul的隔离实现是基于hystrix实现的&#xff0c;hystrix支持线程池隔离和信号量的隔离 # 信号量隔离&#xff1a; it executes on the calling thread and concurrent requests are limited by the semaphore count --引自官网单每次调用线程&#xff0c;当…

中国速度之二神山建设(1):坚强的领导核心,“小团队大后台”组织结构 | IDCF DevOps案例研究...

内容来源&#xff1a;DevOps案例深度研究第4期 – 火神山雷神山 DevOps实践研究战队&#xff08;本文只展示部分PPT及研究成果&#xff0c;全程视频请移步文末&#xff09;本案例内容贡献者&#xff1a;赖泽薇、张扬、邓茜芸、韦一、刘德权、候利涛、冯利娟、常相宇、张力、韩丰…

通过Java编写一个服务器理解动态Web,静态Web

静态Web 说到Servlet自然就要说到Web,Web分为静态Web和动态Web&#xff0c;之前我一直都傻傻分不清两者的区别&#xff0c;直到用JAVA编写了一个服务器后才明白二者的区别&#xff0c;所谓静态Web&#xff0c;实际上就是指&#xff0c;客户端要请求的资源文件&#xff0c;服务器…

Hystrix在网关Zuul使用中遇到问题

Hystrix在网关Zuul使用中遇到问题 Zuul默认隔离策略级别是信号量隔离&#xff0c;默认最大隔离信号量是100 信号量隔离和线程隔离的区别&#xff1a;https://blog.csdn.net/liaojiamin0102/article/details/94394956默认的设置如源码&#xff1a; //在ZuulProperties 类下游…