目录

(1)前序遍历 (DLR) 递归算法

(2)中序遍历 (LDR) 递归算法

(3)后序遍历 (LRD) 递归算法

(4)层序遍历 队列实现方法

层序遍历的定义:

实现方法:

代码实现

结果截图

由于二叉树是递归定义的,显然, 可以把二叉树遍历操作设计成递归算法。

从二叉树的定义可知,一棵二叉树由三部分组成:根结点,左子树和右子树。若规定D、L、R分别代表“访问根结点”、“遍历根结点的左子树”和“遍历根结点的右子树”,则共有6种组合: LDR、DLR、LRD、RDL、DRL和RLD,由于先遍历左子树和先遍历右子树在算法设计上没有本质区别,因此我们只讨论6种组合的前三种: DLR、LDR和LRD,根据遍历方法对访问根结点处理的位置不同,称这三种遍历方法分别为前序遍历(DLR)、中序遍历(LDR)和后序遍历(LRD)方法

//定义一颗二叉树
typedef char DataType;
typedef struct Node {DataType data;struct Node* leftChild;struct Node* rightChild;
}BiTreeNode,*BiTree;void visit(DataType item)
{printf("%c   ", item);
}

(1)前序遍历 (DLR) 递归算法

若二叉树为空,则算法结束;否则:
①访问根结点
②前序遍历根结点的左子树
③前序遍历根结点的右子树
对于所示的二叉树,前序遍历访问结点的次序为:ABDGCEF

void PreOrder(BiTreeNode* root, void visit(DataType item)){//前序遍历二叉树root,访问操作为visitif (root != NULL){visit(root->data);PreOrder(root->leftChild, visit);PreOrder(root->rightChild, visit);}
}

(2)中序遍历 (LDR) 递归算法

若二叉树为空,则算法结束;否则:
①中序遍历根结点的左子树
②访问根结点
③中序遍历根结点的右子树。
对于所示的二叉树,中序遍历访问结点的次序为:DGBAECF

void InOrder(BiTreeNode* root, void visit(DataType item)) {//中序遍历二叉树root,访问操作为visitif (root != NULL){InOrder(root->leftChild, visit);visit(root->data);InOrder(root->rightChild, visit);}
}

(3)后序遍历 (LRD) 递归算法

若二叉树为空,则算法结束; 否则:
①后序遍历根结点的左子树
②后序遍历根结点的右子树
③访问根结点

对于所示的二叉树,后序遍历访问结点的次序为:GDBEFCA

void PostOrder(BiTreeNode* root, void visit(DataType item)) {//后序遍历二叉树root,访问操作为visitif (root != NULL){PostOrder(root->leftChild, visit);PostOrder(root->rightChild, visit);visit(root->data);}
}

(4)层序遍历 队列实现方法

层序遍历的定义:

除前序、中序和后序遍历方法外,二叉树还有层序遍历方法.。
层序遍历方法的要求是:按二叉树的层序次序(即从根结点层至叶结点层),同一层中先按左子树再右子树的次序遍历二叉树。

其实也很好理解,就是按二叉树从上到下,从左到右依次打印每个节点中存储的数据。

对于下图所示的二叉树,层序遍历访问结点的次序为:  A B C D E F G

实现方法:

由分析可知,二叉树层序遍历方法的特点是,在所有未被访问结点的集合中,排列在已访问结点集合中最前面结点的左子树的根结点将最先被访问,然后是该结点的右子树的根结点。这样,如果把已访问的结点放在一个队列中,那么,所有未被访问结点的访问次序就可以由存放在队列中的已访问结点的出队列次序决定。因此,可以借助队列实现二叉树的层序遍历。二叉树的层序遍历算法如下:
①初始化设置一个队列。
②把根结点指针入队列。
③当队列非空时,循环执行步骤(a) 到步骤(c):
        (a)出队列取得一个结点指针,访问该结点;
        (b)若该结点的左子树非空,则将该结点的左孩子指针入队列;
        (c)若该结点的右子树非空,则将该结点的右孩子指针入队列。
④结束。

虽然二叉树是一种非线性结构,二叉树不能像单链表那样每个结点都有一个唯一的前驱结点和一个唯一的后继结点。 但当对一颗二叉树用一种特定的遍历方法(如前序遍历方法、中序遍历方法等)进行遍历时,其遍历序列一定是线性的, 且是唯一的。

代码实现

#include <stdio.h>
#include <stdlib.h>
#define QueueMax 100
typedef char DataType;typedef struct Node
{//定义二叉树结点DataType data;struct Node* leftChild, * rightChild;
}BiTreeNode, * BiTree;typedef struct
{//定义队列BiTree data[QueueMax];int head;int rear;int len;
}Queue;BiTree CreateTree();  //建立二叉树
Queue InitQueue();  //初始化队列
int IsEmptyQueue(Queue seq);  //队列判空
int IsFullQueue(Queue seq);   //队列判满
void PushQueue(Queue* seq, BiTree T);  //入队
void PopQueue(Queue* seq, BiTree* T);  //出队
void LevelOrder(BiTree T);  //层序遍历
void PreOrder(BiTreeNode* root, void visit(DataType item));//前序遍历
void InOrder(BiTreeNode* root, void visit(DataType item));//中序遍历
void PostOrder(BiTreeNode* root, void visit(DataType item));//后序遍历
void visit(DataType item);//访问函数//输入:ABD#G###CE##F##
//前序遍历:A B D G C E F
//中序遍历:D G B A E C F
//后序遍历:G D B E F C A
//层序遍历:A B C D E F Gint main()
{BiTree T = CreateTree();printf("前序遍历:");PreOrder(T, visit);//前序遍历printf("\n中序遍历:");InOrder(T, visit);//中序遍历printf("\n后序遍历:");PostOrder(T, visit);//后序遍历printf("\n层序遍历:");LevelOrder(T);//层序遍历return 0;
}void visit(DataType item)
{printf("%c ", item);
}
BiTree CreateTree()
{  //建立二叉树char c = getchar();if (c == '#')  return NULL; BiTree T = (BiTree)malloc(sizeof(BiTreeNode));T->data = c;T->leftChild = CreateTree();T->rightChild = CreateTree();return T;
}
void PreOrder(BiTreeNode* root, void visit(DataType item)) {//前序遍历二叉树root,访问操作为visitif (root != NULL){visit(root->data);PreOrder(root->leftChild, visit);PreOrder(root->rightChild, visit);}
}void InOrder(BiTreeNode* root, void visit(DataType item)) {//中序遍历二叉树root,访问操作为visitif (root != NULL){InOrder(root->leftChild, visit);visit(root->data);InOrder(root->rightChild, visit);}
}void PostOrder(BiTreeNode* root, void visit(DataType item)) {//后序遍历二叉树root,访问操作为visitif (root != NULL){PostOrder(root->leftChild, visit);PostOrder(root->rightChild, visit);visit(root->data);}
}Queue InitQueue()
{  //初始化队列Queue seq;for (int i = 0; i < QueueMax; i++){seq.data[i] = NULL;}seq.head = 0;seq.rear = -1;seq.len = 0;return seq;
}int IsEmptyQueue(Queue seq)
{  //队列判空if (seq.len == 0)  return 1; return 0;
}int IsFullQueue(Queue seq)
{  //队列判满if (seq.len == QueueMax)  return 1; return 0;
}void PushQueue(Queue* seq, BiTree T)
{  //入队if (IsFullQueue(*seq)) {printf("队列已满\n");return;}seq->rear = (seq->rear + 1) % QueueMax;seq->len++;seq->data[seq->rear] = T;
}void PopQueue(Queue* seq, BiTree* T)
{  //出队if (IsEmptyQueue(*seq)) {printf("队列已空\n");return;}seq->head = (seq->head + 1) % QueueMax;*T = seq->data[seq->head];seq->len--;
}void LevelOrder(BiTree T)
{  //层序遍历Queue seq = InitQueue();BiTree tmp = T;PushQueue(&seq, tmp);while (!IsEmptyQueue(seq)) {printf("%c ", tmp->data);if (tmp->leftChild != NULL) {PushQueue(&seq, tmp->leftChild);}if (tmp->rightChild != NULL) {PushQueue(&seq, tmp->rightChild);}PopQueue(&seq, &tmp);}
}

结果截图

前序遍历、中序遍历、后序遍历层序遍历详解附代码(数据结构C语言)相关推荐

  1. Numpy学习笔记(二):argmax参数中axis=0,axis=1,axis=-1详解附代码

    文章目录 1.argmax和max函数区别 2.axis=0/axis=1/axis=-1的区别 3.具体代码分析 ---3.1一维数组 ---3.2二维数组 ---3.3三维数组 1.argmax和 ...

  2. 集成学习中的软投票和硬投票机制详解和代码实现

    快速回顾集成方法中的软投票和硬投票 集成方法是将两个或多个单独的机器学习算法的结果结合在一起,并试图产生比任何单个算法都准确的结果. 在软投票中,每个类别的概率被平均以产生结果. 例如,如果算法 1 ...

  3. 二叉树深度优先 java_二叉树遍历(前序、中序、后序、层次、深度优先、广度优先遍历) java实现...

    二叉树是一种非常重要的数据结构,非常多其他数据结构都是基于二叉树的基础演变而来的.对于二叉树,有深度遍历和广度遍历,深度遍历有前序.中序以及后序三种遍历方法,广度遍历即我们寻常所说的层次遍历.由于树的 ...

  4. 二十五、二叉树的前序、中序、后序遍历

    一.为何使用树这种数据结构 数组存储方式的分析 优点:通过下标方式访问元素,速度快.对于有序数组,还可使用二分查找提高检索速度. 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较 ...

  5. 手动创建一棵二叉树,然后利用前序、中序、后序、层序进行遍历(从创建二叉树到各种方式遍历)(含运行结果)

    手动创建一棵二叉树,然后利用前序.中序.后序.层序进行遍历 import java.util.LinkedList; import java.util.List; import java.util.Q ...

  6. 把一个数组的值存入二叉树中,然后利用前序、中序、后序3种方式进行遍历(完整代码以及运行结果)(Java)

    把一个数组的值存入二叉树中,然后利用前序.中序.后序3种方式进行遍历(完整代码以及运行结果) 在最近的面试过程中,听说有小伙伴被面试官要求创建二叉树,然后对该二叉树进行遍历,感觉这一直以来都是一个大家 ...

  7. 【LeetCode系列】从中序与后序遍历序列构造二叉树 从前序与中序遍历序列构造二叉树...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树 ...

  8. 105从前序与中序遍历序列构造二叉树 106 从中序与后序遍历序列构造二叉树 (递归 + 哈希)

    引言 这两道题主要是考察二叉树遍历的掌握,即由前序和中序推出原二叉树,由后序和中序推出原二叉树,这里先来说一下推导过程: 前序和中序 知道前序遍历和中序遍历,如何推原二叉树?(直接是结论,可以自行推导 ...

  9. 二叉树的前序、中序和后序遍历介绍及案例

    文章目录 一.介绍 二.建立二叉树 1.节点类 2.二叉树 三.前序遍历 四.中序遍历 五.后序遍历 六.完整代码 一.介绍 前序遍历.中序遍历和后序遍历是二叉树的三种遍历方式,三者很像,具体的遍历步 ...

最新文章

  1. 发现问题,是解决问题的第一步
  2. MySQL 数据库常用命令小结
  3. python爬虫爬取音乐单曲_Python爬取qq音乐的过程实例
  4. linux 上传网页文件大小,Linux:上传未完成的文件 – 文件大小检查(scp / rsync)
  5. sql读取 获取子节点 父节点
  6. 想要构建现代化数据中心?交给戴尔第14代PowerEdge服务器解决吧!
  7. antd upload手动上传_基于MVVCTP5的文件上传
  8. javascript模拟抽奖
  9. 自然辩证法对计算机科学技术的应用,自然辩证法在计算机科学技术中的应用.doc...
  10. unity导入Standard Assets出现错误
  11. 最新苹果开发者账号添加设备UDID
  12. 第一行代码-第二版(郭霖著)笔记(初识Android)
  13. 精准控制的开关电脉冲表征GST薄膜的相变行为(2121.8.29,cyy)
  14. mac c语言运行程序,Mac运行C语言
  15. 论文笔记27 -- (视频压缩)Learned Video Codec with Enriched Reconstruction for CLIC P-frame Coding
  16. STL——SET操作与并交差
  17. 40G/100G万兆交换机如何选择?
  18. 新概念1、2英语学习计划
  19. MySQL中查询和删除重复行
  20. 2021-06-22Android模拟器

热门文章

  1. 死链提交为什么不能提交 html文件,如何正确使用死链提交工具
  2. html中用CSS设置背景
  3. vue项目网站ico图标设置
  4. 玩转B2B平台的商业模式你选对了吗?
  5. 机器学习中的无监督学习是什么?
  6. HCIA--基础网络实验---HTTP服务搭建
  7. cat3速度 rj45_技术词语:4G网CAT.4和CAT.3那个快?
  8. jquery slideToggle 动画问题
  9. 完美解决django 在迁移数据库的时候出现的1146错误
  10. [DebugView] dbgv.sys占用 及 KdPrint输出信息无法显示