hdu 3791 二叉搜索树

Problem Description
判断两序列是否为同一二叉搜索树序列
 
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
 
 
 
 

题意

   先给你一个数字n,接着是一串数字,顺序扫描后建立一棵二叉搜索树。然后再陆续给n串数字,判断它们遍历的二叉树和第一个二叉树是否相同。

    题目给出的字符串长度不大于10.每个数字在0~9之间。且给出的数字不会有重复。

分析

    数据结构的题目,可以直接自定义个二叉树结点的结构来做。但比较复杂,题目已给出数字长度不会大于10.所以直接用静态的链表(即数组)来解就可以了。要是数字的个数太多就不能这样做。                    

  • 假设用于存储的数组为tree。那么根节点保存在tree[0],而左儿子保存在tree[1],右儿子保存在tree[2]。
  • 可知父节点与子节点之间的换算关系是这样的:若父节点为 i ,那么左儿子为(i+1)*2-1,右儿子为(i+1)*2
  • 所以我们要做的就是分别用两个int数组来保存前后两个字符串建立的二叉树。然后去比较这两个数组是否相等就可以了。
  • 那么我们的node数组需要多大呢?10?9?错。这里要考虑所有可能的结点插入情况。其中最极端一种就是有9个结点,但是全部是右子树,这是最浪费空间的情况。此时树的深度是9。考虑深度为9的满二叉树的结点个数:2^9-1。只要大于这个数字就好。
 
 
#include<stdio.h>
#include<string.h>
#define max 512;
int main()
{
    int i,j,n,c;
        int tree[512],tree1[512];
    char s[22];
    while(scanf("%d",&n)!=EOF&&n!=0)
    {
        scanf("%s",s);
        memset(tree,-1,sizeof(tree));
        for(i=0;s[i]!='\0';i++)
        {
            j=0;
            c=s[i]-'0';
            while(tree[j]!=-1)
            {
                if(c>tree[j])
                    j=(j+1)*2;
                if(c<tree[j])
                    j=(j+1)*2-1;
            }
            tree[j]=c;
        }
        while(n--)
        {
            scanf("%s",s);
            memset(tree1,-1,sizeof(tree1));
            for(i=0;s[i]!='\0';i++)
        {
            j=0;
            c=s[i]-'0';
            while(tree1[j]!=-1)
            {
                if(c>tree1[j])
                    j=(j+1)*2;
                if(c<tree1[j])
                    j=(j+1)*2-1;
            }
            tree1[j]=c;
        }
            for(i=0;i<512;i++)
            
                if(tree[i]!=tree1[i])
                {
                    printf("NO\n");
                    break;
                }
                if(i>=512)
                    printf("YES\n");

                
            
            
        }
    }
}

 

 

转载于:https://www.cnblogs.com/xhp956614463/p/3855916.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值