二叉树遍历——BFS

题目见刘汝佳101,闲来无事自己敲敲,很好的模板
#define maxn 300
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct node
{
    int hav;//是否访问了
    int v;//结点值
    node *left,*right;//左右儿子
};

char s[maxn];node *q[maxn];

node *new_node()
{
    node* u=(node*)malloc(sizeof(node));
    if(u!=NULL)
    {
        u->hav=0;//初始状态没访问
        u->left=NULL;
        u->right=NULL;
    }
    return u;
}

node *root=new_node();int failed;

void addnode(int v,char* s){
    int n=strlen(s);
    node *u=root;
    for(int i=0;i<n;i++)
    {
        if(s[i]=='L')
        {
            if(u->left==NULL)u->left=new_node();
            u=u->left;
        }
        if(s[i]=='R')
        {
            if(u->right==NULL)u->right=new_node();
            u=u->right;
        }

    }

        if(u->hav)failed=1;//访问一次以上就失败了
        u->v=v;u->hav=1;//赋值,标记已访问

}

int input(){
    failed=0;
    for(;;){
        if(scanf("%s",s)!=1)return 0;//整个输入结束
        if(!strcmp(s,"()"))break;
        int v;sscanf(&s[1],"%d",&v);
        addnode(v,strchr(s,',')+1);
    }
    return 1;
}

int n,ans[maxn];

int bfs(){
    int front=0,rear=1;
    q[0]=root;
    while(front<rear)
    {
        node *u=q[front++];
        if(!u->hav)return 0;//节点路径未给出

        ans[n++]=u->v;//按二叉树的顺序把结点值存入数组
        if(u->left!=NULL)q[rear++]=u->left;
        if(u->right!=NULL)q[rear++]=u->right;
    }
    return 1;//成功
}

void del_root(node*u)
{
    if(u==NULL)return;
    del_root(u->left);//递归释放左子树
    del_root(u->right);//递归释放右子树
    free(u);
}
int main(){
    while(input())
    {
        n=0;
        if(failed)printf("-1\n");
        else
        {
            if(!bfs())printf("-1\n");//有节点的路径没给出
            else
                for(int i=0;i<n;i++)
                printf("%d%c",ans[i],i==n-1?'\n':' ');
        }
        del_root(root);//防止内存泄露
        root=new_node();//为下一次输入构造树根
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值