队列实现按层次遍历二叉树

来源:互联网 发布:网络监控摄像头安装图解 编辑:程序博客网 时间:2024/05/22 04:25

就是按层次来 首先是根节点A入队列 然后是根节点的左B右C子树 根节点A出队列 左子B的左D右子树入队列然后B出队列 C的左右子树入对列C出队列 然后是D以此循环知道队列的头部和尾部重合队列空 输出完毕

思路并不难,但是在网上看的写的有点麻烦 照着一个ppt写了个简单一点的 可能不是最优的代码 但是很容易能理解这个思想和过程

#include<iostream>#include<malloc.h>#define LEN sizeof(BiTree)#define MAXQSIZE   100;         //队列长度using namespace std;struct BiTree                           //二叉树{    char data;    BiTree *lchild,*rchild;}*T;struct Qnode        //链队列{    BiTree *Queue[100];   //M表示循环指针队列的长度     int nfront,nrear;        //头和尾  用于处理数组所以int就可以}head;BiTree* CreatBiTree()  //类似先序遍历创立,空位置补*{    BiTree *T;    char ch;cin>>ch;    if(ch=='*')T=NULL;    else{        T=(BiTree *)malloc(LEN);        T->data=ch;        T->lchild=CreatBiTree();        T->rchild=CreatBiTree();     }    return T;}void Levelorder(BiTree *T)  {  BiTree *p;                                                                    // 建立一个 工作树指针p     Qnode Q;Q.nrear=Q.nfront=0;                                //初始化这个队列      if (T!=NULL)        {   Q.Queue[Q.nrear]=T;                                         //如果T不空       Q.nrear=(Q.nrear+1)%MAXQSIZE;              //加入一个尾尾部        while (Q.nfront !=Q.nrear)                         //如果这个 队列不空  也就是二叉树不结束            {                  p=Q.Queue[Q.nfront];                                        //p等于队列头       cout<<p->data;                                              //输出队列头部                 Q.nfront=(Q.nfront+1)%MAXQSIZE;           //front往后移动一个                    if (p->lchild)                                                    //如果做左孩子不空                { Q.Queue[Q.nrear]=p->lchild;                     //那么尾部加上左孩子                Q.nrear=(Q.nrear+1)%MAXQSIZE;                 //rear往后移动一个                }                if (p->rchild)                                              //然后是右孩子                {  Q.Queue[Q.nrear]=p->rchild;             //同上                Q.nrear=(Q.nrear+1)%MAXQSIZE;                }            }        }}int main()                                                                   //运行 结束{    BiTree*test=CreatBiTree();    Levelorder(test);return 0;}

0 0