hdu3791(二叉搜索树构造)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3791

题目大意:给出若干行数列,其中第一行的数列为基本二叉搜索树的模式,剩下的数列都为需要比较的数列,若构造出的二叉搜索树与基本数列相同,则输出“YES”,否则输出“NO”;

解题思路:根据题目给出的数列构造二叉搜索树,然后循环遍历树,判断是否相等。因为题目较简单,实用数组进行简单的模拟,根据左子节点是根节点下标的2倍,而右子节点是根节点下标的2倍加1.

AC代码:

#include <iostream>
#include <cstring>
using namespace std;
void inserttree(int *tr,int value)
{
    int index=1;
    while(tr[index]!=-1)
    {
        if(tr[index]<value)
            index = index*2+1;
        else index = index*2;
    }
    tr[index] = value;
}
void buildtree(int *tree,char *in,int len)
{
    for(int i=0;i<len;i++)
    {
        inserttree(tree,in[i]-'0');
    }
}
bool compare(int *a,int *b,int len)
{
    bool f = true;
    for(int i=0;i<len;i++)
    {
        if(a[i]!=b[i])f = false;
    }
    return f;
}
int main()
{
    int source[1000];
    int pattern[1000];
    int n;
    while(cin>>n)
    {
        memset(source,-1,sizeof(source));
        if(n==0)break;
        for(int i=0;i<=n;i++)
        {
            char putin[1000];
            cin>>putin;
            int len = strlen(putin);
            if(i==0)buildtree(source,putin,len);
            else
            {
                memset(pattern,-1,sizeof(pattern));
                buildtree(pattern,putin,len);
                bool flag = compare(source,pattern,512);
                if(flag)cout<<"YES"<<endl;
                else cout<<"NO"<<endl;
            }
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值