SDUT 2482 二叉排序树

这个题也是比较简单的,但悲催的我忘了把调试用的代码注释掉,结果错了几遍。。。。sad

代码操作步骤是这样的:

1、对第1个数字序列进行建树操作,并保存先序遍历的结果。

2、对后来要比较的数字序列进行建树操作,并保存先序遍历结果。

3、比较两个结果是否相同。

以下是代码:

#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef struct node 
{
    char c;
    struct node *l,*r;
} tr;
tr *head,*po;
char s[15],s1[15];
int x,y;
void b(tr *q,char s)
{
    if(q->c<s)
    {
        if(q->r==NULL)
        {
            po=(tr*)malloc(sizeof(tr));
            po->c=s;
            po->l=NULL;
            po->r=NULL;
            q->r=po;
        }
        else
        {
            b(q->r,s);
        }
    }
    else
    {
        if(q->l==NULL)
        {
            po=(tr*)malloc(sizeof(tr));
            po->c=s;
            po->l=NULL;
            po->r=NULL;
            q->l=po;
        }
        else
        {
            b(q->l,s);
        }
    }
}
void build(char *s)
{
    int p=strlen(s);
    head=(tr*)malloc(sizeof(tr));
    head->c=*s;
    head->l=NULL;
    head->r=NULL;
    p--;
    s++;
    while(p--)
    {
        b(head,*s);
        s++;
    }
}
void ha(tr *p)
{
    if(p==NULL)
    {
        return ;
    }
    s[x]=p->c;
    x++;
    ha(p->l);
    ha(p->r);
}
void hb(tr *p)
{
    if(p==NULL)
    {
        return ;
    }
    s1[y]=p->c;
    y++;
    hb(p->l);
    hb(p->r);
}
int main()
{
    int n;
    while(scanf("%d",&n),n)
    {
        scanf("%s",s);
        build(s);
        x=0;
        ha(head);
        s[x]='\0';
        while(n--)
        {
            scanf("%s",s1);
            build(s1);
            y=0;
            hb(head);
            s[y]='\0';

            if(strcmp(s,s1)==0)
            {
                printf("YES\n");
            }
            else
            {
                printf("NO\n");
            }
        }
    }
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值