二叉树先中后序递归遍历与非递归遍历、层次遍历

文章目录

      • 1 先序遍历
        • 1.1 先序遍历递归
        • 1.2 先序遍历非递归
      • 2 中序遍历
        • 2.1 中序遍历递归
        • 2.2 中序遍历非递归
      • 3 后序遍历
        • 3.1 后序遍历递归
        • 3.2 后序遍历非递归
      • 4 层序遍历

1 先序遍历

若二叉树为空,则操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树

1.1 先序遍历递归

void PreviousOrderTraverse(BTNode T) {if (T == NULL) {return;}/* 对节点的操作 */PreviousOrderTraverse(T->lchild);    // 先序遍历左子树PreviousOrderTraverse(T->rchild);   // 再先序遍历右子树
}

1.2 先序遍历非递归

递归的实现依赖于栈,那么就将二叉树的递归遍历转换为非递归遍历,也就是利用栈来实现

void PreviousOrderTraverse(BTNode *bt)
{if(bt !=NULL{BTNode *Stack[maxSize];  int top=-1;BTNode *p=NULL;        //p为遍历指针Stack[++top]=bt;while(top!=-1{p=Stack[top--];   //根结点出栈并访问visit(p);if(p->rchild!=NULL//检测左右孩子是否存在Stack[++top]=p->rchild;  //先入if(p->rchild!=NULL)Stack[++top]=p->lchild;}}
} 

2 中序遍历

若二叉树为空,则操作返回,否则从根节点开始(注意不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树

2.1 中序遍历递归

void InOrderTraverse(BTNode T) {if (T == NULL) {return;}InOrderTraverse(T->lchild);  // 先中序遍历左子树/* 对结点的操作 */InOrderTraverse(T->rchild); // 再中序遍历右子树
}

2.2 中序遍历非递归

void InOrderTraverse(BTNode *bt) 
{BTNode  p = T; // p 是遍历指针Stack S = CreateStack(MAXSIZE); // 初始化栈while (p != NULL || !IsEmpty(S)) { // 栈不为空或 p 不为空时遍历if (p != NULL) {Push(S, p);	// 一直向左并将沿途节点压入堆栈p= p->leftChild;} else { // p 为空时,栈不为空,弹出节点访问右孩子p= Pop(S); // 弹出堆栈visit();//访问节点p = p->rightChild;}}
}

3 后序遍历

若二叉树为空,则操作返回,否则从左到右,先叶子后结点的方式遍历访问左右子树,最后是访问根结点

3.1 后序遍历递归

void PostOrderTraverse(BTNode T) {if (T == NULL) {return;}PostOrderTraverse(T->lchild);    // 先后序遍历左子树PostOrderTraverse(T->rchild);   // 再后序遍历右子树/* 对结点的操作 */
}

3.2 后序遍历非递归

  1. 后序非递归遍历二叉树的顺序是先访问左子树,再访问右子树,最后访问根结点。当用堆栈存储结点时,必须分清返回根结点时是从左子树返回还是从右子树返回的;因此,必须使用辅助指针指向最近访问过的结点。
void PostOrderTraverse(BTNode T) {BTNode p = T; // p 为遍历指针BTNode pTop = NULL; // pTop 为临时指针BTNode pLast = NULL; // pLast 为保存已访问节点指针Stack S = CreateStack(MAXSIZE); // 初始化栈while (p != NULL || !IsEmpty(S)) { // 栈不为空或 p 不为空时遍历 while (p != NULL) {Push(s, p); // 一直向左并将沿途节点压入堆栈 p = p->lchild;}pTop = GetStackTop(s); // 取栈顶元素,不是出栈//当栈顶元素的右孩子为空,或者为已经遍历过的节点if (pTop->rchild == NULL || pTop->rchild == pLast) {StackPop(s); // 出栈,打印,并令遍历过的节点为此时的栈顶元素visit();//访问节点pLast = pTop; // 将 pTop 设为已经遍历过的节点 continue; // 继续循环}p = pTop->rchild; //遍历它的右孩子}
}
  1. 在先序遍历非递归上进行修改,先进左孩子,再进右孩子得逆后序序列,再借助一个栈将逆后序序列转化为后序序列
void PostorderTraverse(BTNode *bt)
{if(bt!=NULL){/*定义两个栈*/BTNode *Stack1[maxSize]; int top1=-1; //遍历栈 BTNode *Stack2[maxSize]; int top2=-1; //结果序列逆序的栈BTNode *p=NULL;Stack1[++top1]=bt;while(top1!=NULL){p=Stack1[top1--];Stack2[++top2]=p; //每次1出栈,便进2栈 /* 以下与先序遍历区别:左右孩子入栈顺序相反*/if(p->lchild!=NULL)Stack1[++top1]=p->lchild;if(p->rchild!=NULL)Stack1[++top1]=p->rchild;		}while(top2!=-1){/*出栈序列即为后序遍历序列*/p=Stack2[top2--];visit(p); //visit是访问p的函数,此处执行打印结点值操作 }}
}

4 层序遍历

若二叉树为空,则操作返回,否则从树的第一层,也就是根结点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问

  1. 根结点入队
  2. 从队列中取出一个元素
  3. 访问该元素所指的结点
  4. 若该元素所指结点的左右孩子为非空,则将其左、右孩子的指针顺序入队
void LevelTraverse(BTNode *bt)
{if(bt!=NULL)  //根结点不空即树不空 {int front,rear;BTNode *que[maxSize];front=rear=0;BTNode *p; //p是遍历指针 rear=(rear+1)%maxSize;que[rear]=bt; //根结点入队 while(front!=rear)  //队列为空则遍历结束 {front=(front+1)%maxSize;p=que[front];visit(p);if(p->lchild!=NULL){rear=(rear+1)%maxSize;que[rear]=p->lchild; //如果左子树不空,则入队 } 	if(p->rchild!=NULL){rear=(rear+1)%maxSize;que[rear]=p->rchild; //如果右子树不空,则入队 }		}}
}

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

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

相关文章

类脑计算将何去何从?

来源:内容由半导体行业观察(ID:icbank)编译:nature.摘要类脑计算新技术有望通过完全不同的方式处理信息,能效极高,并能处理我们加速产生的大量非结构化和嘈杂的数据。为了实现这一承诺&#xff…

1 计算机网络体系结构与OSI参考模型

文章目录1 计算机网络概述1.1 计算机网络概念1.2 计算机网络的分类2 OSI 七层参考模型应用层表示层会话层传输层网络层数据链路层物理层3 OSI参考模型与网络排错4 OSI参考模型与网络安全5 TCP/IP协议和OSI参考模型1 计算机网络概述 1.1 计算机网络概念 计算机网络概念&#xf…

一个故事讲完 CPU 的工作原理

来自:知乎 作者:柳两丛 www.zhihu.com/question/40571490/answer/718942643上二年级的小明正坐在教室里。现在是数学课,下午第一节,窗外的蝉鸣、缓缓旋转的吊扇让同学们昏昏欲睡。此时,刘老师在黑板上写下一个问题&a…

2 计算机网络性能指标

文章目录速率带宽吞吐量时延时延带宽积往返时间网络利用率速率 连接在计算机网络上的主机在数字信道上传送数据位数的速率,也称为data rate或bit rate。 单位是b/s, kb/s, Mb/s, Gb/s. 比特(bit)是计算机中数据量的单位,也是信息论…

Anthropic 公司研究人员从简单的 AI 中获得关于 Transformer 的新理解

来源:ScienceAI编辑 :橘子皮在过去的两年里,人工智能程序的语言流畅度达到了惊人的水平。其中最大和最好的都是基于 2017 年发明的称为 Transformer 的架构。它以方程式列表的形式作为程序遵循的一种蓝图。但除了这个简单的数学大纲之外&…

3 物理层 数据通信基础知识 奈氏准则与香农定理 物理层传输介质 信道复用技术

文章目录1 物理层基本概念2 数据通信的基础知识2.1 典型的数据通信系统模型2.2 与通信相关的几个术语2.3 有关信道的几个概念2.4 基带(baseband)信号和带通(band pass)信号2.5 几种最基本的调制方法2.6 网卡传送信号时的编码格式2.7 信道的极限容量2.8 信道能够通过的频率范围2…

向真实世界应用进军:持续自监督学习的挑战

来源:图灵人工智能编译:OGAI编辑:陈彩娴在 Yann Lecun 等人的推动下,自监督学习成为了深度学习领域最受瞩目的技术之一。互联网世界源源不断产生的数据流无疑是充分发挥自监督学习能力的最佳土壤。然而,将自监督学习应…

人类“超级大脑”背后的规模法则

来源:集智俱乐部作者:郭瑞东 编辑:邓一雪摘要不同动物的大脑具有不同形状和大小。大自然赋予像人类这样脑容量大的灵长类动物比例较大的大脑皮层。然而,比较研究表明,分配给大脑白质连接(大脑区域间长距离沟…

Meta AI 宣布对人脑和语言处理进行长期研究

来源:ScienceAI编辑:绿萝人类的大脑长期以来一直是一个难题——它是如何发展的,它如何继续进化,它被开发和未开发的能力。人工智能 (AI) 和机器学习 (ML) 模型也是如此。正如人类大脑创建的 AI 和 ML 模型日益复杂一样&#xff0c…

10年100亿!“新基石研究员”项目正式发布

来源: 中国科学报文:《中国科学报》记者 赵广立4月30日,《中国科学报》获悉,一项总投入达100亿元、面向基础研究领域的社会资助项目——“新基石研究员项目”正式发布。在国家有关部门的指导下,“新基石研究员项目”由…

代表地球文明精髓的E=mc²,为什么被称为“死亡方程式”

来源:大数据文摘有这样一条方程式,原腾讯副总裁吴军博士说,如果地球毁灭,要在一张名片上写下地球文明的全部精髓,他会写下三个公式,其中就包含这个方程式;搜狐CEO张朝阳专门开了堂线下物理课&am…

北交桑基韬:“超”人的机器学习,非语义特征的得与失

来源:AI科技评论作者:桑基韬整理:维克多人工智能目前最大的“拦路虎”是不可信赖性,以深度学习为基础的算法,在实验室环境下可以达到甚至超过人类的水平,但在很多实际应用场景下的性能无法保证,…

手把手教你搭建一个中式菜谱知识图谱可视化系统

手把手教你搭建一个中式菜谱知识图谱可视化系统中式菜谱知识图谱1、系统功能2、先来看看效果实体间关联关系及实体信息显示不同类型实体开关显示搜索功能展示3、系统实现流程3.1 数据爬取3.2 D3可视化中式菜谱知识图谱 今天分享一个自己从数据爬取到d3可视化的中式菜谱知识图谱…

AI数字人未来十大展望

来源 :商汤智能产业研究院编辑 :刘振航从电影中逼真的CG人物,到能够与我们面对面进行互动的智能服务助手,数字人会经历几级进化?数字人正在从有颜无智的“CG数字模特”,进化为可提高生产力、驱动创新服务的…

知识图谱最新权威综述论文解读:开篇部分

论文地址:http://arxiv.org/abs/2002.00388 这篇综述是数据科学权威 Philip S. Yu 团队对知识图谱领域的最新综述论文,论文从知识图谱的发展历史、知识表示学习、知识获取、知识应用、未来研究方向等方面描述了知识图谱的全局。 首先,咱们先…

耗资52亿美元,历时15年,人类有史以来建造的最复杂机器

来源:世界先进制造技术论坛欧洲大型强子对撞机是现在世界上最大、能量最高的粒子加速器,是一种将质子加速对撞的高能物理设备,英文名称为LHC。LHC是人类迄今建造的最大最复杂的科学设备,它的建设历时15年,耗资52亿美元…

贝叶斯深度学习:一个统一深度学习和概率图模型的框架

来源:AI科技评论 作者:王灏整理:维克多人工智能(AI)的进展显示,通过构建多层的深度网络,利用大量数据进行学习,可以获得性能的显著提升。但这些进展基本上是发生在感知任务中&#…

知识图谱最新权威综述论文解读:知识表示学习部分

知识图谱最新权威综述论文解读:知识表示学习部分知识图谱表示学习1 表示空间1.1 Point-wise空间1.2 复数向量空间​1.3 高斯分布1.4 流形和群2 打分函数2.1 基于距离的打分函数​2.2 语义匹配模型:​3 编码模型3.1 线性/双线性模型3.2 张量分解模型3.3 神…

对知识图谱的告白:斯坦福大学CS520课程介绍

斯坦福大学CS520知识图谱系列课程,从这个课程的编号就足以看出对计算机科学的告白。 相信大家对斯坦福大学的计算机学科公开课一点也不陌生,对很多人来说,面向计算机视觉的CS231n和面向自然语言处理的CS224n几乎成为了入门人工智能领域以及C…

脑计算将何去何从?

来源:内容由半导体行业观察(ID:icbank)编译:nature.摘要类脑计算新技术有望通过完全不同的方式处理信息,能效极高,并能处理我们加速产生的大量非结构化和嘈杂的数据。为了实现这一承诺&#xff…