数据结构 — 6.顺序队列(循环)实现二叉树层次遍历

【问题描述】编写按层次顺序(同一层自左至右)遍历二叉树的算法


【输入形式】A B * C * * D * *  


【输出形式】A B D C


/*
    1.顺序循环队列
    2.二叉树先序创建
    3.二叉树层次遍历(队列实现)
*/

#include<stdio.h>
#include<iostream>
#include<malloc.h>
#define MAX 50

using namespace std;

/* 二叉树结构 */
typedef struct BTree{
	char data;
	struct BTree *lchild,*rchild;
}BiTNode,*BiTree;

/* 顺序队列 */
typedef struct {
	BiTree qu[MAX];
	int front,rear;
}Queue;

/* 先序创建 二叉树 */
void CreatBinaryTree(BiTree &T){
    //输入的字符
	char ch;
	scanf("%c",&ch);

	//叶子结束符 ‘*’
	if(ch=='*') T = NULL;
	else{
        //分配内存
		T=(BiTNode *)malloc(sizeof(BiTNode));
		//T = (BiTree)malloc(sizeof(BiTNode));
        //数据域
		T->data = ch;
        //递归创建左右子树
		CreatBinaryTree(T->lchild);
		CreatBinaryTree(T->rchild);
	}
}

/* 队列初始化 */
void InitQueue(Queue &q){//‘&’ 引用传递 !
    q.front = 0;
    q.rear = 0;
}

/* 从尾部入队 */
void EnterQueue(Queue &q,BiTree &p){
    //取余 -> 队列是否排满
	if((q.rear+1)%MAX != q.front){
        //队尾入队
		q.qu[q.rear] = p;
        //队尾下标后移
		q.rear = (q.rear+1)%MAX;
	}
}

/* 从队头出队 */
void QuitQueue(Queue &q,BiTree &p){

	if(q.front != q.rear){
        //将数据域中的数据取出来
		p = q.qu[q.front];
        //队头下标后移
		q.front = (q.front + 1)%MAX;
	}
}//注意!在处理队头队尾下标时不要忘了取余

/* 二叉树层次遍历 */
void FloorTraverse(BiTree &T){
	// 一个二叉树操作结点、 一个队列
	BiTree p;
	Queue q;

	//初始化
	p = T;
	InitQueue(q);

	if(p){
        //将二叉树根节点入队
        EnterQueue(q, p);
        //队列 为空是循环结束条件 -> 队列进队出队顺序就是层次遍历的顺序
        while(q.front != q.rear){
            //出队、 访问(visit)
			QuitQueue(q,p);
			cout<<p->data;
            //将此节点的左右子树分别从队尾入队
			if(p->lchild)
			EnterQueue(q,p->lchild);
			if(p->rchild)
			EnterQueue(q,p->rchild);
		}
	}
}

/* 主函数 */
int main(){
    BiTree T;
    CreatBinaryTree(T);
    FloorTraverse(T);
    return 0;
}


你可能感兴趣的:(数据结构,算法,遍历,C语言,二叉树层次遍历)