数据结构与算法系列-树-二叉树的遍历(按层次遍历)

按层次遍历算法

按层次遍历就是按二叉树层次从上而下,从左到右顺序访问其各结点

算法思想:

建立一循环队列,队列元素为指针类型变量,此循环队列用来暂存二叉树结点的指针。

在遍历二叉树之前,先将此树的根节点指针送入循环队列,开始层次遍历时再将此根节点指针出队来访问根节点,然后判断其左或右儿子是否存在,若存在,则将左右儿子结点的指针依次送入队列。左儿子指针先于右儿子指针入队。

#include<malloc.h>
#include<stdio.h>
#define QUEUESIZE 20 /*定义循环队列最大容量为20*/
typedef struct node{
	int data1;
	struct node *lchild;
	struct node *rchild;
}BINTNODE,*BINTREE; /*定义二叉链表指针类型*/
typedef struct cirqueue{/*循环队列的存储结构定义*/
	int front,rear;/*定义队列头 尾指针*/
	BINTNODE *data[QUEUESIZE];
}CIRQUEUE;

void createbintree(BINTREE *t){/*输入二叉树的先嘘遍历序列,创建二叉链表*/
	int a;
	scanf("%d",&a);
	if(a==0)
		*t=NULL;
	else{
		*t = (BINTNODE *)malloc(sizeof(BINTNODE));/*申请结点*t的结点空间*/
		(*t)->data1 = a;/*将结点数据a放入根结点的数据域*/
		createbintree(&(*t)->lchild);/*建立左子树*/
		createbintree(&(*t)->rchild);/*建立左子树*/
	}
}

leverorder(BINTREE t){/*层次遍历二叉树*/
	CIRQUEUE *q;
	BINTREE p;
	q = (CIRQUEUE *)malloc(sizeof(CIRQUEUE));/*申请循环队列空间*/
	q ->rear = q->front = 0;/*将循环队列初始化为空*/
	q ->data[q->rear] = t;/*将跟结点指针入队*/
	q ->rear = (q->rear+1)%QUEUESIZE;/*将队列尾指针加1*/
	while(q->rear != q->front){
		p = q->data[q->front];/*取队首元素*p*/
		printf("%d",p->data1);/*打印*p结点的数据域信息*/
		q ->front = (q->front+1)%QUEUESIZE;/*将队列尾指针加1*/
		if((q->rear+1)%QUEUESIZE ==q->front)/*队列为满*/
			printf("the queue is full");
		else{
			if(p->lchild!=NULL){//左孩子不为空
				q->data[q->rear] = p->lchild;
				q->rear = (q->rear+1)%QUEUESIZE;/*修改队列尾指针*/
			}
		}
			if((q->rear+1)%QUEUESIZE ==q->front)/*队列为满*/
			printf("the queue is full");
		else{
			if(p->lchild!=NULL){//右孩子不为空
				q->data[q->rear] = p->rchild;
				q->rear = (q->rear+1)%QUEUESIZE;/*修改队列尾指针*/
			}
		}
	}
}

main(){
	BINTREE t = NULL;
	printf("\nPlease input nodes of BINTREE: ");
	createbintree(&t);
	if(t!=NULL){
		printf("The leverorder is: ");
		leverorder(t);
	}else{
			printf("The bintree is empty ");
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值