当前位置: 首页 > backend >正文

数据结构 - 树的遍历

一、二叉树的遍历

对于二叉树,常用的遍历方式包括:先序遍历、中序遍历、后序遍历和层次遍历 

1、先序遍历(PreOrder)

先序遍历的操作过程如下:

若二叉树为空,则什么也不做;否则,

(1)访问根结点;

(2)先序遍历左子树;

(3)先序遍历右子树。

void PreOrder(BiTree T){   //先序遍历if(T!=NULL){visit(T);              //访问根结点PreOrder(T->lchild);   //递归遍历左子树PreOrder(T->rchild);   //递归遍历右子树}
}

2、中序遍历(InOrder)

中序遍历(InOrder)的操作过程如下:

若二叉树为空,则什么也不做;否则,

(1)中序遍历左子树;

(2)访问根结点;

(3)中序遍历右子树。

void InOrder(BiTree T){    //中序遍历if(T!=NULL){InOrder(T->lchild);   //递归遍历左子树visit(T);               //访问根结点InOrder(T->rchild);   //递归遍历右子树}
}

3、后序遍历(PostOrder)

后序遍历(PostOrder)的操作过程如下:

若二叉树为空,则什么也不做;否则,

(1)后序遍历左子树;

(2)后序遍历右子树;

(3)访问根结点。

 

void PostOrder(BiTree T){    //后序遍历伪代码if(T!=NULL){PostOrder(T->lchild);   //递归遍历PostOrder(T->rchild);   //递归遍历右子树visit(T);              //访问根结点}
}

4、层次遍历(LevelOrder)

层次遍历(LevelOrder)的操作过程如下:

(1)首先借助一个队列,先将二叉树根结点入队,然后出队,访问出队结点;

(2) 若它有左子树,则将左子树根结点入队;

(3) 若它有右子树,则将右子树根结点入队;

(4) 然后出队,访问出队结点。如此反复,直到队列为空[1,5]。

void LevelOrder(BiTree T){    //层次遍历InitQueue(Q);               //初始化辅助队列BiTree P;EnQueue(Q,T);              //将根结点入队while(!IsEmpty(Q)){       //队列不空则循环DeQueue(Q,P);            //队头结点出队visit(p);                 //访问出队结点if(p->lchild!=NULL)EnQueue(Q,p->lchild); //左子树不空,则左子树根结点入队if(p->rchild!=NULL)EnQueue(Q,p->rchild); //右子树不空,则右子树根结点入队}
}

5、遍历示例

存在如下图所示二叉树:

二叉树示例

先序遍历为ABDECF(根-左-右)

中序遍历为DBEAFC(左-根-右)(仅二叉树有中序遍历)

后序遍历为DEBFCA(左-右-根)

层次遍历为ABCDEF

二、一般树的遍历

树的遍历是指用某种方式访问树中的每个结点,且仅访问一次。主要有三种方式:

1.先根遍历:若树非空,先访问树的根结点,然后依次先根遍历根结点的每棵子树。其遍历序列与其转换为二叉树的先序序列相同。

2.后根遍历:若树非空,先依次后根遍历根结点的每棵子树,然后访问树的根结点。其遍历序列与其转换为二叉树的后序序列相同。

3.层次遍历:与二叉树的层次遍历思想基本相同,即按层序依次访问各结点。

例如:如下图所示:

先根遍历为ABEFGCDHI

后根遍历为EFGBCHIDA

层次遍历为ABCDEFGHI

http://www.xdnf.cn/news/9636.html

相关文章:

  • 【JavaEE】-- 网络原理
  • NetLink
  • SNTP在电力系统通信中的应用
  • C# NX二次开发-查找连续倒圆角面
  • GB/T 36140-2018 装配式玻纤增强无机材料复合保温墙体检测
  • 【第2章 绘制】2.7 路径、描边与填充
  • 【C++进阶篇】哈希表的模拟实现(赋源码)
  • WSL中ubuntu通过Windows带代理访问github
  • 【razor】采集的同时支持预览和传输的讨论和改造方案探讨
  • DAY38
  • 整合Jdk17+Spring Boot3.2+Elasticsearch9.0+mybatis3.5.12的简单用法
  • 电化学震荡- N 型负微分电阻
  • Android LiveData 详解
  • QT使用cmake添加资源文件闪退,创建了qrc文件不能添加的问题解决
  • 深圳SMT贴片打样全流程优化方案
  • 在监视器(Monitor)内部,是如何做线程同步的?
  • 半桥栅极驱动芯片D2104M使用手册
  • 虚拟机配置网络
  • mac10.15.7 安装erlang23.3 源码安装(未完待续)
  • Compass Arena大模型竞技场
  • Linux中的Shell脚本基础
  • 易学探索助手-项目记录(十一)
  • Polar编译码(SCL译码)和LDPC编译码(BP译码)的matlab性能仿真,并对比香浓限
  • 96. 不同的二叉搜索树
  • uniapp调用java接口 跨域问题
  • 数据分析学习笔记——A/B测试
  • 题目 3314: 蓝桥杯2025年第十六届省赛真题-魔法科考试
  • Fastmcp本地搭建 ,查询本地mysql,接入agent-cursor--详细流程
  • Odoo 条码功能全面深度解析(VIP15万字版)
  • 仿真科普|弥合市场需求断层,高性能仿真,“性能”与“安全”如何兼得?