c语言二叉树层序遍历,二叉树二叉链表的层序遍历(C语言)

这篇博客详细介绍了如何使用队列实现非递归的二叉树层序遍历。通过创建一个循环队列,并以根节点为起点,逐层访问每个节点,实现了二叉树的层次遍历。代码示例中展示了从字符序列构建二叉树,然后进行层序遍历的过程。
摘要由CSDN通过智能技术生成

#include #include

/**

* 二叉树二叉链表之非递归遍历:层序遍历

* 算法思想:借助一个队列;根树进队;队不为空时循环“从队列中出一个树p,访问该树根结点;

* 若它有左子树,左子树进队;若它有右子树,右子树进队。”

* (保证了元素进队顺序是从树的上层到下层,且同层元素在队列中从左到右相邻)

* (注:为了节约空间,这里的树进队,是指树的地址进队,而不是树结点进队,队列中存放的是对各树地址的引用)*/

#define OK 1;

#define TURE 1;

#define FALSE 0;

#define ERROR 0;

const int OVERFLOW = -2;const int MAXSIZE = 100;

typedefintStatus;

typedefcharTElemType;//二叉链表结构定义

typedef structBiNode{

TElemType data;struct BiNode *lchild, *rchild;

} BiNode,*BiTree;//顺序循环队列定义

typedef struct{

BiTree*base; //存放树型指针

int front; //头指针,若队列不为空,指向队列头元素

int rear; //尾指针,若队列不为空,指向队列尾元素的下一个位置

} SqQueue;//由字符序列创建二叉树

Status CreateBiTree(BiTree *tree,TElemType data[],int *j,intlen){if((*j)<=len-1){if(data[(*j)]==‘#‘){

(*tree)=NULL;

(*j)++;

}else{

(*tree)=(BiTree)malloc(sizeof(BiNode));if(!(*tree)) returnOVERFLOW;

(*tree)->data=data[(*j)]; //生成根结点

(*j)++;

CreateBiTree(&((*tree)->lchild),data,j,len); //构造左子树

CreateBiTree(&((*tree)->rchild),data,j,len); //构造右子树

}

}returnOK;

}//访问二叉树结点

Status Visit(BiTree tree){

printf("%c",tree->data);returnOK;

}//借助队列实现二叉链表的层序遍历

Status LevelOrder_ByQueue(BiTree tree) {

BiTree p;

SqQueue queue1;

InitQueue(&queue1);

EnQueue(&queue1,tree); //根结点入队

while(queue1.front!=queue1.rear){ //队不为空

DeQueue(&queue1,&p); //根节点出队

Visit(p);if(p->lchild!=NULL) EnQueue(&queue1,p->lchild); //有左孩子就进队

if(p->rchild!=NULL) EnQueue(&queue1,p->rchild); //有右孩子也进队

}returnOK;

}/***用到队列的相关函数***/

//循环队列初始化

Status InitQueue(SqQueue *queue) {

queue->base=(BiTree*)malloc(sizeof(BiTree)*MAXSIZE); //分配队列数组空间

if(!queue->base) return OVERFLOW; //分配失败

queue->front=0;

queue->rear=0;returnOK;

}//循环队列入队操作

Status EnQueue(SqQueue *queue,BiTree elem){if((queue->rear+1)%MAXSIZE==queue->front){ //队满

returnERROR;

}else{

queue->base[queue->rear]=elem;

queue->rear=(queue->rear+1)%MAXSIZE;returnOK;

}

}//循环队列出队操作

Status DeQueue(SqQueue *queue,BiTree *elem){if(queue->front==queue->rear){ //队空

returnERROR;

}else{

(*elem)=queue->base[queue->front];

queue->front=(queue->front+1)%MAXSIZE;returnOK;

}

}int main(void){//示例二叉树的结构

/*A

/

B

/ C D

/ E F

G*/

//指向二叉树的指针

BiTree bitree1;//创建二叉树 待用数据

TElemType data1[]={‘A‘,‘B‘,‘C‘,‘#‘,‘#‘,‘D‘,‘E‘,‘#‘,‘G‘,‘#‘,‘#‘,‘F‘,‘#‘,‘#‘,‘#‘,}; //先序遍历序列

int len1=sizeof(data1)/sizeof(data1[0]);int* j1=(int*)malloc(sizeof(int));*j1=0;//按先序遍历序列创建二叉树

Status createBiTreeResult = CreateBiTree(&bitree1,data1,j1,len1);

printf("二叉树创建结果:%d\n",createBiTreeResult);//层序遍历二叉树

Status levelOrder_ByQueue = LevelOrder_ByQueue(bitree1); //注:这里参数是二叉树根结点,而不是指针

printf("\n层序遍历二叉树结果:%d\n",levelOrder_ByQueue);

printf("\nEND");return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值