二叉树的前中后遍历以及层序遍历操作(C语言)
Posted bfhonor
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的前中后遍历以及层序遍历操作(C语言)相关的知识,希望对你有一定的参考价值。
一、什么是遍历?
- 遍历:按照某种次序把所有结点都访问一遍。
二、 二叉树的遍历
- 二叉树的递归特性:
①、要么是个空二叉树
②、要么就是由“根节点+左子树+右子树”组成的二叉树
(一)先序遍历(代码)
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild'
}BiTNode,*BiTree;
//先序遍历
void PreOrder(BiTree T){
if(T != NULL){
visit(T); //访问根结点
PreOrder(T -> lchild); //递归遍历左子树
PreOrder(T -> rchild); //递归遍历右子树
}
}
(二)中序遍历(代码)
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//中序遍历
void InOrder(BiTree T){
if(T != NULL){
InOrder(T -> lchild); //递归遍历左子树
visit(T); //访问根结点
InOrder(T -> rchild); //递归遍历右子树
}
}
(三)后序遍历(代码)
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//后序遍历
void PostOrder(BiTree T){
if(T != NULL){
PostOrder(T -> lchild); //递归遍历左子树
PostOrder(T -> rchild); //递归遍历右子树
visit(T); //访问根结点
}
}
求树的深度(应用)
(四)层序遍历
- 算法思想:
①、初始化一个辅助队列
②、根结点入队
③、若队列非空,则队头结点出队,访问该结点,并将其左、右孩子插入队尾(如果有的话)
④、重复③直至队列为空
//二叉树的结点(链式存储)
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//链式队列结点
typedef struct LinkNode{
BiTNode *data; //存指针而不是结点
struct LinkNode *next;
}LinkNode;
typedef struct{
LinkNode *front,*rear;//队友队尾
}LinkQueue;
//层序遍历
void LevelOrder(BiTree T){
LinkQueue Q;
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); //右孩子入队
}
}
}
以上是关于二叉树的前中后遍历以及层序遍历操作(C语言)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode JS实现 二叉树(前中后层序)遍历(递归迭代法)