C语言二叉树层序遍历(广度优先遍历)

#include<stdio.h>
#include<stdlib.h>
typedef struct treenode{
    char c;
    struct treenode *left;
    struct treenode *right;
}treenode,*ptree;//定义一个树结点结构体
typedef struct list{
    ptree data;
    struct list *next;
}list,*plist;//辅助队列
typedef struct listht{
    list *front,*rear;
};//队列头尾指针
void enlist(listht &Q,ptree p){
    plist s=(plist) malloc(sizeof (list));
    s->data=p;s->next=NULL;
    Q.rear->next=s;
    Q.rear=s;
}//入队
void delist(listht &Q,ptree &p){
    if(Q.front==Q.rear){
        return;
    }//判断队列是不是空
    plist s=Q.front->next;
    p=s->data;
    Q.front->next=s->next;
    if(Q.rear==s){//删除的是最后一个就把队列置空
        Q.rear=Q.front;
    }
}//出队
bool empty(listht Q){
    if(Q.front==Q.rear){
        return true;
    }else{
        return false;
    }
}
void levelorder(ptree tree){
    listht Q;
    Q.front=Q.rear=(plist) malloc(sizeof (list));
    Q.front->next=NULL;
    ptree p;
    enlist(Q,tree);
    while(!empty(Q)){
        delist(Q,p);//出队当前结点并打印
        printf("%c",p->c);
        if(p->left!=NULL){
            enlist(Q,p->left);
        }
        if(p->right!=NULL){
            enlist(Q,p->right);
        }
    }
}

int main(){
    ptree pnew;
    char c;
    ptree tree=NULL;
    plist phead=NULL,ptail=NULL,listnew=NULL,pcur=NULL;
    while(scanf("%c",&c)){
        if(c=='\n'){
            break;
        }
        pnew=(ptree)calloc(1,sizeof(treenode));
        pnew->c=c;
        listnew=(plist)calloc(1,sizeof(list));
        listnew->data=pnew;
        if(NULL==tree){
            tree=pnew;
            phead=listnew;
            ptail=listnew;
            pcur=listnew;
        }else{
            ptail->next=listnew;
            ptail=listnew;
            if(NULL==pcur->data->left){
                pcur->data->left=pnew;
            }else if(NULL==pcur->data->right){
                pcur->data->right=pnew;
                pcur=pcur->next;
            }
        }
    }//创二叉树的过程
     levelorder(tree);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值