【数据结构】遍历二叉树(递归和非递归遍历的先序、中序和后序遍历、层次遍历法)

目录

  • 【数据结构】遍历二叉树(递归和非递归遍历的先序、中序和后序遍历、层次遍历法)
    • 一、递归算法
      • 先(根)序的遍历算法
      • 中(根)序的遍历算法
      • 后(根)序的遍历算法
    • 二、非递归算法
      • 层次遍历
      • 先序遍历非递归算法
      • 中序遍历非递归算法
      • 后序遍历非递归算法

【数据结构】遍历二叉树(递归和非递归遍历的先序、中序和后序遍历、层次遍历法)

采用二叉链表的形式储存
结点结构 [lchild,data,rchild]

特点:二叉链表找子孙结点容易,找祖先结点麻烦。

typedef struct BiTNode {                char data;  struct BiTNode *lchild, *rchild; //左右子树根结点地址
} BiTNode, *BiTree;

一、递归算法

递归算法书写简单,但是效率低。

先(根)序的遍历算法

先序遍历(递归定义 递归结束的条件就是:空树 )

  1. 若二叉树为空树,则空操作;
  2. 否则,(1)访问根结点;(2)先序遍历左子树;(3)先序遍历右子树。

先序遍历的递归算法:

//先序遍历 递归访问每一个结点
void xxbl(BiTree T){if(T){//递归调用的结束条件printf("%c",T->data);//访问结点xxbl(T->lchild);//遍历左子树xxbl(T->rchild);//遍历右子树}
}

中(根)序的遍历算法

  1. 若二叉树为空树,则空操作;
  2. 否则,(1)中序遍历左子树;(2)访问根结点;(3)中序遍历右子树。

中序遍历的递归算法:

void zxbl(BiTree T)
{if (T) {zxbl(T->lchild); printf("%c",T->data); zxbl(T->rchild);}
}

后(根)序的遍历算法

  1. 若二叉树为空树,则空操作;
  2. 否则,(1)后序遍历左子树;(2)后序遍历右子树;(3)访问根结点。
void hxbl(BiTree T)
{if(T){hxbl(T->lchild); hxbl(T->rchild); printf("%c",T->data);}
}

二、非递归算法

  1. 用循环队列实现二叉树的按层次遍历
  2. 使用 来实现 先保存 后 访问

层次遍历

从根节点开始,先访问第一层的结点,在访问第二层的结点。
特点:自顶向下,从左到右的访问次序。
借用 队列(循环队列) 来实现层次遍历的功能,所有要访问的结点都存放在队列中。

  1. 初始时若二叉树非空,则只需要知道要访问的第一个结点为根结点。
  2. 只要队列不空,说明队列中存有要访问的结点,则取队首结点访问,并将其非空左右孩子依次插入队列中。
    在这里插入图片描述
    算法代码示例:
//层次遍历算法
#define MAX 100
void LevelTrave(BiTree T){BiTree Q[MAX],p;//用循环队列实现二叉树的按层次遍历int f=r=0;//队列 队首和队尾指针if(T==NULL)	return;Q(r++)=T;// 根节点入队while(f!=r){p=Q[f++];//出队printf("%c",p->data);if(p->lchild){if(r>=MAX){printf("overflow");exit(0);}Q[r++]=p->lchild;}if(p->rchild){if(r>=MAX){printf("overflow");exit(0);}Q[r++]=p->rchild;}}
}

先序遍历非递归算法

先序遍历非递归算法的实现:访问根节点后,在访问左子树之前,先将其非空右子树的地址入栈(保存)。
在这里插入图片描述
采用顺序栈来存放访问过的结点右子树:

#define MAX 10000
typedef struct{BiTree data[MAX];int top;
}SeqStack;
void PreorderTraverse(BiTree T){//T为二叉树的根结点SeqStack s;//新建一个 栈BiTree p;s.top=-1; //栈顶指针p = T;//while(p){while(p){//访问左子树printf("%c",p->data); //访问p结点if(p->rchild) {//将p结点的非空右孩子入栈保存if(s.top==MAX-1) exit (0);//栈溢出else s.data[++s.top]=p->rchild;//入栈}p =p->lchild; //访问p的左孩子  }if (s.top!=-1) p=s.data[s.top--];//出栈}
}

中序遍历非递归算法

  1. 基本思想:访问根结点的左子树前,应保存其根结点,以便左子树访问结束后,访问根和根的右子树
  2. 图中a结点先于b结点被保存,但是其访问要在b及b的右子树被访问后进行----先保存后访问----先进后出----借助栈来实现

在这里插入图片描述

void InorderTraverse(BiTree T){//中序遍历根结点为T的二叉树SeqStack s; BiTree p;s.top=-1; p = T;while(p||(s.top!=-1)){ //while(p){if(s.top==MAX-1) exit (0);s.data[++s.top]=p; p =p->lchild;// 一直去访问左子树 同时将结点入栈//向左下走一直走到头}if (s.top!=-1){p=s.data[s.top--];//根节点出栈printf("%c",p->data);p = p->rchild; //访问该根节点的右子树}}
}

后序遍历非递归算法

  1. 后序遍历非递归算法的实现:访问根结点的子树前,应保存其根结点,以便左子树访问结束后,访问根的右子树和根
  2. 图中a结点先于b结点被保存,但是其访问要在b及其右子树被访问后进行----先保存后访问----先进后出----借助栈实现

只有在其左、右子树被访问后才能被访问(需要标记 定义一个flag标记其左右子树是否都被访问过)
在这里插入图片描述

#define	MAX5
typedef struct{BiTree q;int flag;
}dataelem;
//q存放的是遍历操作访问到的一棵子树的根节点
//flag=0代表目前是在访问q结点的左子树,flag=1代表目前是在访问q结点的右子树
typedef struct{
dataelem data[MAX];
int top;//栈顶指针
}SeqStack2;

代码示例(!!!):

void postorder(BiTree T){SeqStack2 s;s.top=-1;p=T;do{while(p!=NULL){if(s.top==MAX-1) exit (0);//栈溢出s.data[++s.top].q=p; s.data[s.top].flag=0; p=p->lchild;//一直向左下访问 }while((s.top>-1)&&(s.data[s.top].flag==1)){ //p=s.data[s.top--].q; printf(%c”,p->data); }if(s.top>-1){s.data[s.top].flag=1;//标记 此时开始访问 其右子树p=s.data[s.top].q; p=p->rchild;}}while(s.top>-1);
}

感谢阅读!!!

  1. 树与二叉树知识点文章: 【数据结构】树与二叉树(递归法先序、中序、后序、层次遍历二叉树、二叉树的建立以及求树高的方法)
  2. 二叉树遍历算法的应用: 【数据结构】树与二叉树遍历算法的应用(求叶子节点个数、求树高、复制二叉树、创建二叉树、二叉树存放表达式、交换二叉树每个结点的左右孩子)
  3. 二叉树遍历算法的应用: 【数据结构】树与森林(树的存储结构、森林与二叉树的转化、树与森林的遍历)

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

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

相关文章

存储器管理

01.存储器的层次结构:计算机在执行指令时,几乎每条指令都会涉及对存储器的访问,因此要求计算机对存储器的访问速度能跟得上处理机的运行速度,在现代计算机系统中,都采用了多层结构的存储器。至少应该有三层&#xff1a…

【漏洞复现】浙大恩特客户资源管理系统 i0004_openFileByStream.jsp 任意文件读取漏洞

0x01 产品简介 浙大恩特客户资源管理系统是一款外贸管理软件,它提供了多种功能,包括客户档案管理、邮件管理、OA外贸办公管理系统、分管权限管理、联系跟进及提醒、业务检查管理、统计分析管理等。 0x02 漏洞概述 浙大恩特客户资源管理系统存在任意文件…

ENSP-旁挂式AC

提醒:如果AC不能成功上线AP,一般问题不会出在AC上,优先关注AC-AP线路上的二层或三层组网的三层交换机 拓扑图 管理VLAN:99 | 业务VLAN:100 注意点: 1.连接AP的接口需要打上pvid为管理vlan的标签 2.AC和…

通用视觉大模型调研

humanbench HumanBench: Towards General Human-centric Perception with Projector Assisted Pretraining;为了解决不同任务之间的conflict以及不同dataset之间的差异(相同任务),提出PATH,backbone是所有任务共享、projector是任务级别共享…

一个开源的全自动视频生成软件MoneyPrinterTurbo

只需提供一个视频 主题 或 关键词 ,就可以全自动生成视频文案、视频素材、视频字幕、视频背景音乐,然后合成一个高清的短视频。 一:功能特性 完整的 MVC架构,代码 结构清晰,易于维护,支持 API 和 Web界面…

【面试亮点】线上GC问题排查止损解决 (heap space OutOfMemory排查止损解决)

【面试亮点】线上GC问题排查&止损&解决(heap space OOM排查&止损&解决) 许多同学总和我抱怨说面试的时候没有线上实际排查解决gc问题的经验,我这里分享我团队的一次比较好的从 发现问题->及时止损->排查问题->修复问题->复盘 全流程的实践经验,希…

DOS命令第二篇

雷迪斯and the乡亲们 欢迎你们来到 奇幻的编程世界 一、echo命令 作用: 输出一个内容到终端 格式: echo 要输出的内容 案例: 直接输出一个“你好” 二、ping 概念: 在网络中通信的时候,主机之间进行通信依靠…

转行或者跳槽入职一家新公司,应该如何快速上手工作?

不管是干测试也好或者其它任何职业,没有谁会在一家公司待一辈子,转行不一定,但是跳槽是每一个打工人早晚都会面临的事情,今天就来跟大家聊聊这件事~ 入职一家新公司,你应该做什么可以最快速的上手工作? 这…

App Inventor 2 如何预览PDF文档?

预览PDF文档的方式 你可以使用Activity启动器查看已存储在你的设备上的 pdf 文档,也可以使用Web客户端通过网址URL打开 pdf 文档。 App Inventor 2 可以使用 .pdf 扩展名从程序包资产中查看 pdf 文件,不再需要外部 pdf 查看器! 代码如下&a…

车载摄像头畸变校正解决方案,打造无畸变高清视界

在车载摄像头日益普及的今天,摄像头图像的畸变问题成为了制约图像质量提升的一大瓶颈。畸变不仅影响画面的美观度,更关键的是它可能导致智能驾驶系统对环境的误判,进而威胁到行车安全。美摄科技凭借其在图像处理领域的深厚实力,推…

redis清理缓存接口开发

文章目录 1 用户注册1.1 简要描述1.2 请求URL1.3 请求方式1.4 参数1.5 返回示例1.6 返回参数说明1.7 备注 2 用户登录2.1 简要描述2.2 请求URL2.3 请求方式2.4 参数2.5 返回示例2.6 返回参数说明2.7 备注 3 权限校验3.1 简要描述3.2 请求URL3.3 请求方式3.4 参数3.5 返回示例3.…

leetcode刷题(python)——(一)

01.01.04 练习题目(第 01 天) 1. 2235. 两整数相加 1.1 题目大意 描述:给定两个整数 n u m 1 num1 num1 和 n u m 2 num2 num2。 要求:返回这两个整数的和。 说明: − 100 ≤ n u m 1 , n u m 2 ≤ 100 -100 \l…

中东跨境电商平台Noon注册开店步骤详解

中东地区,素以“满地富豪”闻名,同时拥有发达的电子商务环境与较高的居民消费水平,吸引了大量跨境电商从业者前来寻求商机。其中,Noon作为中东地区颇具人气的电商平台,自然而然成为了众多卖家开拓中东市场的首选平台。…

普通类的成员函数模板

4-4普通类的成员函数模板、类模板的成员函数模板、&#xff08;c11&#xff09;模板显式实例化&#xff0c;模板声明_普通类的模板函数能否为虚函数-CSDN博客 实例&#xff1a; #include <QApplication> #include <QDebug> struct user_inform {QString user_name;…

牛客 接头密匙

Problem: 牛客 接头密匙 文章目录 思路解题方法复杂度Code 思路 这个问题可以通过使用前缀树&#xff08;Trie&#xff09;来解决。前缀树是一种用于存储字符串的数据结构&#xff0c;其中每个节点代表一个字符串的前缀。在这个问题中&#xff0c;我们可以使用前缀树来存储数组…

Flex布局(秒懂弹性盒子的使用)

目录 一、Flex介绍 1.概念 主要概念&#xff1a; 2.Flex容器属性 3.Flex项目属性 4.优势 二、Flex使用 1.弹性盒子内容 2.flex-direction 语法 3.justify-content 属性 4.align-items 属性 语法 5.flex-wrap 属性 语法&#xff1a; 6.align-content 属性 语法&am…

在 Google Colab 中安装torch-xla 报错

关于深度学习的一些学习框架,我使用过pytorch,caffe,caffe2,openchatkit,oneflow等,最近我将长达几十万字的报错手册重新进行了整理,制作出一个新的专栏,主要记录这几种常见的开发框架在安装和使用过程中常见的报错,以及我是如何解决掉的,以此来帮助更多的深度学习开…

jetson系列开发板使用虚拟机烧录系统时,遇见无法识别开发板的情况

在双系统中的ubuntu系统烧录没问题&#xff0c;但是电脑Ubuntu系统由于版本低&#xff0c;所以没有网络&#xff0c;烧录起来还的连网线&#xff0c;所以问了开发板的工程师&#xff0c;所幸&#xff0c;解决了问题&#xff0c;很感谢工程师的指导&#xff0c;特此记录一下&…

【研发日记】CANoe自动化测试的配置方式(三)——SystemVariables数组方式

文章目录 前言 一、例程功能 二、仿真ECU 三、SystemVariables数组&#xff1a; 四、测试模块 五、测试运行效果 六、分析和应用 总结 前言 近期在做的一个自动化测试项目&#xff0c;尝试了一种以前没用过的测试配置方式&#xff0c;感觉效果还不错。然后又回顾了一下以…

顺序表C语言实现

这是SL.h头文件 #pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h>typedef int SeqListType;typedef struct SeqList {SeqListType* arr;int next;int capacity; }SL; //调试使用void SLPrint(SL* ps);//初始化void SLInit(SL* ps);//…