zoukankan      html  css  js  c++  java
  • 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]!='';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]!='';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
    ");
                        break;
                    }
                    if(i>=512)
                        printf("YES
    ");
    
                    
                
                
            }
        }
    }
     
  • 相关阅读:
    Flex通过Blazeds利用Remoteservice与后台java消息推送
    flex 实时更新的一些方法总结
    想让领导放权,就先让领导放心(深度好文)
    教师表(TEACHER.DBF)
    Delphi中基本控件之SaveDialog控件的使用总结
    Delphi实现类的持久化保存(DFM格式)
    人事中的BP是什么意思?
    从HR 到SBP其实还有很长的一段路要走
    在DBGrid中,按ctrl+Delete不让删除,怎么实现
    delphi adoquery的post和UpdateBatch
  • 原文地址:https://www.cnblogs.com/xhp956614463/p/3855916.html
Copyright © 2011-2022 走看看