二叉搜索树(HDU3791)

判断两序列是否为同一二叉搜索树序列
Input
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
Output
如果序列相同则输出YES,否则输出NO
Sample Input
2
567432
543267
576342
0
Sample Output
YES
NO
//这是比较简单的二叉搜索树题目,第一次看到时不知道题目什么意思,唉!囧!就是按序列顺序构建二叉搜索树,看下构建的是否一样就可以了

#include <stdio.h>
#include <string.h>
int
 a[1024],b[1024];
void
 cta(char c,int i)//这个和下面可以合并一个,用指针传递数组
{

    if
(a[i]==0)
      {
a[i]=c;return;}
    if
(a[i]>c)
     cta(c,i<<1);
     else

     cta(c,i<<1|1);
}

void
 ctb(char c,int i)
{

    if
(b[i]==0)
      {
b[i]=c;return;}
    if
(b[i]>c)
     ctb(c,i<<1);
     else

     ctb(c,i<<1|1);
}

int
 cmp(int j)//这里是让构建好的2棵树比较!
{

    int
 m1,m2;
    if
(a[j]!=b[j])
     return
 0;
    if
(a[j]==0)
     return
 1;
     m1=cmp(j<<1);
     m2=cmp(j<<1|1);
    return
 m1>m2?m2:m1;//递归回程,判断树是否一样
}

int
 main()
{
 int i,n;
  char
 c[13],s[13];
  while
(scanf("%d",&n),n)
  {
   memset(a,0,sizeof(a));
      scanf("%s",c);//输入原序列
      for
(i=0;c[i]!='\0';i++)
         cta(c[i],1);
      while
(n--)
      {
 memset(b,0,sizeof(b));//开始这里和a放一起了,就错了!
         scanf("%s",s);
        for
(i=0;s[i]!='\0';i++)
           ctb(s[i],1);
        if
(cmp(1))
        printf("YES\n");
        else

        printf("NO\n");
      }
  }

  return
 0;
}

这样做速度还是快的,0Ms,做的第一道二叉树题目!

                                                           -----江财小子

转载于:https://www.cnblogs.com/372465774y/archive/2012/03/28/2421684.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值