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

来源:互联网 发布:黑米软件官方 编辑:程序博客网 时间:2024/06/06 13:01

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


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


【输出形式】A B D C


/*    1.顺序循环队列    2.二叉树先序创建    3.二叉树层次遍历(队列实现)*/#include<stdio.h>#include<iostream>#include<malloc.h>#define MAX 50using 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;}


0 0
原创粉丝点击