第六章:数据结构基础。第二部分

6.3.2 层次遍历:

问题描述:

  按照层次遍历二叉树。

代码:

/*
    数据的输入形式为:
    数据1:(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
    数据2:(3,L) (4,R) ()

*/
#include <stdio.h>
#include <string.h>
#define N 1000
int failed;//输入数据是否合法的标志变量;

//定义二叉树的结点类型;
typedef struct LNode
{
    int value;
    int number;//两者分别代表是否被赋过值以及被赋值的大小。
    LNode *L,*R;
}LNode,*LinkList;
LNode *root;
//创建 新结点,并赋值为0的函数;
LNode *NewNode()
{
    LNode *m = new LNode;
    if(m!=NULL)
    {
        m->value=m->number=0;
        m->L=m->R=NULL;
    }
    return m;
}

// 向二叉树中插入结点;
// 按照路径行走,当路径不存在的时候调用newnode来创建新结点。
void AddNode(int v,char *s)
{
    //v代表结点值;s代表行走路径;
    int i,j,len=strlen(s);
    LNode *u=root;//root为根结点;
    for(i=0;i<len-1;i++)
    {
        if(s[i]=='L')
        {
            if(u->L==NULL) u->L=NewNode();
            u=u->L;
        }
        else if(s[i]=='R')
        {
            if(u->R==NULL) u->R=NewNode();
            u=u->R;
        }
    }
    if(u->value==1) failed=1; //failed代表输入数据是否符合规则,定义为全局变量;
    u->number=v;u->value=1;
}

char s[N+10];
int Input()
{
    //创建二叉树;
    failed=0;
    root=NewNode();
    for(;;)
    {
        if(scanf("%s",s)!=1) return 0;
        if(!strcmp(s,"()")) break;
        int v;
        sscanf(&s[1],"%d",&v);//读入结点值,并赋值给v;
        AddNode(v,strchr(s,',')+1);
    }
    return 1;
}

//宽度优先遍历二叉树;按层次遍历;
int n=0,ans[N+10];
int dfs()
{
    int front=0,rear=1;
    LNode *q[N+10];
    q[0]=root;
    while(front<rear)
    {
        //宽度优先遍历,利用队列;
        LNode *u=q[front++];
        if(!u->value) {failed=1;return 0;}
        ans[n++]=u->number;
        if(u->L) q[rear++]=u->L;
        if(u->R) q[rear++]=u->R;
    }
    return 1;
}
int main()
{
    //创建二叉树;
    Input();

    dfs();
    //按层次输出结点值;
    if(failed==1) printf("-1\n");
    else
        {
            for(int i=0;i<n;i++)
                printf("%d  ",ans[i]);
            printf("\n");
        }
    return 0;
}

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/songacm/p/3386889.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值